2017-11-28 1 views
0

Ich möchte ein JavaFX-Projekt zu Modell, Sicht und Controller trennen. Ich benutze Netbeans beim Erstellen einer JavaFX-Anwendung. Aber ich möchte den Code getrennt, eine eigene GUI, eigene Logik und eine Main-Klasse, nur um die Anwendung zu starten (Ich möchte 3 separate Klassen). Aber ich bin nicht in der Lage, dieses Problem zu lösen. Die automatische erzeugte Code sieht wie folgt aus:So trennen Sie eine JavaFX-Anwendung

package at.wueschn.www; 

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class Main extends Application { 

@Override 
public void start(Stage primaryStage) { 
    Button btn = new Button(); 
    btn.setText("Say 'Hello World'"); 
    btn.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      System.out.println("Hello World!"); 
     } 
    }); 

    StackPane root = new StackPane(); 
    root.getChildren().add(btn); 

    Scene scene = new Scene(root, 300, 250); 

    primaryStage.setTitle("Hello World!"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

public static void main(String[] args) { 
    launch(args); 
} 

    } 
+2

Können Sie zeigen, was Sie tatsächlich versucht haben? Vermutlich haben Sie versucht, eine View-Klasse zu erstellen und sie in der 'start()' -Methode usw. zu instanziieren? –

+0

Wenn Sie 'NetBeans' verwenden, wählen Sie zuerst' File -> New Project'. Dann 'JavaFX -> JavaFX FXML Application' – Sedrick

+0

Danke für Ihre Hilfe. Entschuldigung, ich habe vergessen zu schreiben, dass ich die Lösung ohne FXML-Datei haben will, nur reinen Java-Code. – user3747849

Antwort

1

Wenn Sie NetBeans verwenden, zuerst File -> New Project wählen. Dann JavaFX -> JavaFX FXML Application

enter image description here

Hinweis: Dies ist ein grundlegender MVC Setup. Sie könnten all dies mit reinem Code tun. James_D könnte Ihnen wahrscheinlich mit fortgeschrittenen MCV Ideen helfen.

Hinweis: Wenn Sie diesen einfachen Ansatz verwenden, empfehle ich Ihnen Download SceneBuilder, um Ihnen mit der Ansicht zu helfen. Tutorial

+0

Danke für Ihre Hilfe. Entschuldigung, ich habe vergessen zu schreiben, dass ich die Lösung ohne FXML-Datei haben will, nur reinen Java-Code. – user3747849

0

Hier ist ein Beispiel "nur Java" (d. H. Kein FXML) von MVC. Beachten Sie, dass es viele verschiedene Varianten von MVC gibt, bei denen es sich um ein sehr locker definiertes Muster handelt. Dies ist eine Art "klassische" Variante: Das Modell hat keine Kenntnis von der/den Ansicht (en) oder Controller (welches das gemeinsame Thema für alle MVC-Designs ist), der Controller hat einen Bezug auf das Modell und ruft auf Methoden darauf, einige einfache Logik implementieren, und die Ansicht hat einen Verweis auf das Modell und Controller; Beobachten des Modells und Aktualisieren der Ansichtskomponenten, wenn sich die Daten ändern, und Aufrufen von Methoden auf dem Controller als Reaktion auf Benutzereingaben. Andere Varianten dieses Musters (MVVM, MVP usw.) variieren typischerweise in der Beziehung zwischen der Ansicht und dem Controller.

Diese einfache Anwendung implementiert einen sehr einfachen Taschenrechner, der einfach zwei einstellige Ganzzahlen hinzufügen kann.

Das Modell:

import javafx.beans.binding.NumberBinding; 
import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.SimpleIntegerProperty; 

public class Model { 

    private boolean firstNumberEntered ; 

    private final IntegerProperty firstNumber = new SimpleIntegerProperty(); 
    private final IntegerProperty secondNumber = new SimpleIntegerProperty(); 
    private final NumberBinding sum = firstNumber.add(secondNumber); 

    public Model() { 
     firstNumber.addListener((obs, oldValue, newValue) -> firstNumberEntered = true); 
    } 

    public IntegerProperty firstNumberProperty() { 
     return firstNumber ; 
    } 

    public int getFirstNumber() { 
     return firstNumberProperty().get(); 
    } 

    public void setFirstNumber(int number) { 
     firstNumberProperty().set(number); 
    } 

    public IntegerProperty secondNumberProperty() { 
     return secondNumber ; 
    } 

    public int getSecondNumber() { 
     return secondNumberProperty().get(); 
    } 

    public void setSecondNumber(int number) { 
     secondNumberProperty().set(number); 
    } 

    public NumberBinding sumBinding() { 
     return sum ; 
    } 

    public int getSum() { 
     return sum.intValue(); 
    } 

    public boolean isFirstNumberEntered() { 
     return firstNumberEntered ; 
    } 

    public void reset() { 
     setFirstNumber(0); 
     setSecondNumber(0); 
     firstNumberEntered = false ; 
    } 
} 

Der Controller:

public class Controller { 

    private final Model model ; 

    public Controller(Model model) { 
     this.model = model ; 
    } 

    public void enterFirstNumber(int number) { 
     model.setFirstNumber(number); 
    } 

    public void enterSecondNumber(int number) { 
     model.setSecondNumber(number); 
    } 

    public void clear() { 
     model.reset(); 
    } 

    public void enterNumber(int number) { 
     if (model.isFirstNumberEntered()) { 
      enterSecondNumber(number) ; 
     } else { 
      enterFirstNumber(number); 
     } 
    } 
} 

Die Ansicht:

import javafx.beans.binding.Bindings; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Parent; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.ColumnConstraints; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.RowConstraints; 

public class View { 

    private final BorderPane root ; 

    private final Controller controller ; 

    public View(Model model, Controller controller) { 

     this.controller = controller ; 

     root = new BorderPane(); 

     GridPane buttons = new GridPane(); 
     configureButtons(buttons); 

     createAndAddButtons(controller, buttons); 

     Label resultLabel = new Label(); 
     configureDisplay(model, resultLabel); 

     root.setTop(resultLabel); 
     root.setCenter(buttons); 

     root.setStyle("-fx-font-size: 36pt;"); 
    } 

    private void configureDisplay(Model model, Label resultLabel) { 
     BorderPane.setAlignment(resultLabel, Pos.CENTER_RIGHT); 
     BorderPane.setMargin(resultLabel, new Insets(5)); 
     resultLabel.textProperty().bind(Bindings.createStringBinding(
       () -> String.format("%d + %d = %d", model.getFirstNumber(), model.getSecondNumber(), model.getSum()), 
       model.firstNumberProperty(), model.secondNumberProperty(), model.sumBinding())); 
    } 

    private void createAndAddButtons(Controller controller, GridPane buttons) { 
     for (int i = 1 ; i <= 9 ; i++) { 
      int row = (9 - i)/3 ; 
      int column = (i -1) % 3 ; 
      buttons.add(createNumberButton(i), column, row); 
     } 
     buttons.add(createNumberButton(0), 0, 3); 
     Button clearButton = createButton("C"); 
     clearButton.setOnAction(e -> controller.clear()); 
     buttons.add(clearButton, 1, 3, 2, 1); 
    } 

    private void configureButtons(GridPane buttons) { 
     for (int row = 0 ; row < 4 ; row++) { 
      RowConstraints rc = new RowConstraints(); 
      rc.setFillHeight(true); 
      rc.setPercentHeight(100.0/4); 
      buttons.getRowConstraints().add(rc); 
     } 
     for (int column = 0 ; column < 3 ; column++) { 
      ColumnConstraints cc = new ColumnConstraints(); 
      cc.setFillWidth(true); 
      cc.setPercentWidth(100.0/3); 
      buttons.getColumnConstraints().add(cc); 
     } 
     buttons.setVgap(5); 
     buttons.setHgap(5); 
     buttons.setPadding(new Insets(5)); 
    } 

    public Parent getRoot() { 
     return root ; 
    } 

    private Button createNumberButton(int number) { 
     Button button = createButton(Integer.toString(number)); 
     button.setOnAction(e -> controller.enterNumber(number)); 
     return button ; 
    } 

    private Button createButton(String text) { 
     Button button = new Button(text); 
     button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); 
     return button ; 
    } 
} 

und schließlich die "Haupt" Klasse, die jedes Stück erzeugt und zeigt die Ansicht in ein Fenster:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class TrivialCalcaulatorApp extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Model model = new Model(); 
     Controller controller = new Controller(model); 
     View view = new View(model, controller); 

     Scene scene = new Scene(view.getRoot()); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Vielen Dank, das ist die Lösung, nach der ich gesucht habe !! – user3747849

Verwandte Themen