2017-11-28 21 views
0

JavaFXプロジェクトをモデル、ビュー、およびコントローラに分けたいとします。 JavaFXアプリケーションを作成するときにnetbeansを使用します。 しかし私は、コードを別々のGUI、独自のロジック、メインクラスだけでアプリケーションを開始する(3つの別々のクラスが必要です)必要があります。 しかし、私はこの問題を解決することができません。 自動作成されたコードは次のようになります。JavaFXアプリケーションの分離方法

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

実際に試したことを表示できますか?おそらくあなたは何らかのビュークラスを作成し、 'start()'メソッドなどでそれをインスタンス化しようとしましたか? –

+0

'NetBeans'を使用している場合、最初に' File - > New Project'を選択してください。その後、 'JavaFX - > JavaFX FXMLアプリケーション' – Sedrick

+0

あなたの助けに感謝します。申し訳ありませんが、書くのを忘れてしまいました.FXML-Fileなしのソリューション、純粋なJavaコードがほしいと思っています。 – user3747849

答えて

1

あなたがNetBeansを使用している場合は、最初のFile -> New Projectを選択してください。その後JavaFX -> JavaFX FXML Application

enter image description here

注:これは、基本的なMVC設定です。あなたは純粋なコードを使ってこれをすべて行うことができます。 James_Dはおそらくより高度なMCVアイデアを手伝ってくれるでしょう。

注:この簡単な方法を採用する場合は、SceneBuilderをダウンロードして表示することをお勧めします。 Tutorial

+0

ご協力いただきありがとうございます。申し訳ありませんが、書くのを忘れてしまいました.FXML-Fileなしのソリューション、純粋なJavaコードがほしいと思っています。 – user3747849

0

ここには、MVCの「Javaのみ」(すなわち、FXMLなし)の例があります。非常に緩やかに定義されたパターンであるMVCのさまざまなバリエーションがあることに注意してください。これは一種の「古典的な」変形です。モデルには、ビューやコントローラ(すべてのMVCタイプの設計の共通テーマ)に関する知識がなく、コントローラはモデルへの参照を持ち、いくつかの単純なロジックを実装し、ビューにはモデルとコントローラの両方のリファレンスがあります。モデルを観察し、データが変更されたときにビューコンポーネントを更新し、ユーザ入力に応答してコントローラ上でメソッドを呼び出す。このパターンの他の変種(MVVM、MVPなど)は、通常、ビューとコントローラの関係が異なります。

この単純なアプリケーションは、2つの1桁の整数を追加する方法を知っている非常に基本的な電卓を実装しています。

モデル:

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 ; 
    } 
} 

コントローラ:

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); 
     } 
    } 
} 

ビュー:

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 ; 
    } 
} 

各片を作成し、ビューを表示し、最終的に "主" クラス窓:

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

ありがとう、それは私が探していた解決策です! – user3747849

関連する問題