如何分离javafx GUI结构及其实现?

时间:2017-06-02 17:13:03

标签: java javafx

例如这段代码:

public class VendorManagementSystem extends Application {

    @Override
    public void start(Stage primaryStage) {
        VBox main_pane = new VBox(15);
        main_pane.setPadding(new Insets(10,10,10,10));

        Button addItem_mainPane = new Button("Add Item");
        addItem_mainPane.setPrefWidth(120);
        Button cancelation_button = new Button("Close");
        cancelation_button.setPrefWidth(120);

        main_pane.getChildren().addAll(addItem_mainPane,sellItem_mainPane,cancelation_button);
        main_pane.setAlignment(Pos.CENTER);

        Scene scene = new Scene(main_pane);

        primaryStage.setHeight(450);
        primaryStage.setWidth(650);
        primaryStage.setTitle("Vendor Management System");
        primaryStage.setScene(scene);
        primaryStage.show();

然后我想在另一堂课中将其分开:

cancelation_button.setOnAction(e->{
      primaryStage.close();

}); 

我尝试创建另一个类并继承javafx类以在另一个类中创建实现:

public class ControlsImplementation extends VendorManagementSystem{

   cancelation_button.setOnAction(e->{

              primaryStage.close();

        });

}

但是我无法解决这些错误:

  

错误:<标识符>预期          cancelation_button.setOnAction(E-> {

     

错误:<标识符>预期          cancelation_button.setOnAction(E-> {

     

错误:非法启动类型               });

有关如何分离javafx gui结构和控件实现的任何建议。

1 个答案:

答案 0 :(得分:1)

您可以为视图和控制器创建单独的类。您应该使这两个独立于Application类,它负责启动应用程序并管理其生命周期:

查看课程:

public class View extends VBox {

    private final Controller controller ;

    public View(Controller controller) {
        this.controller = controller ;
        buildUI();
    }

    private void buildUI() {
        setPadding(new Insets(10,10,10,10));

        Button addItem = new Button("Add Item");
        addItem.setPrefWidth(120);
        Button cancelation = new Button("Close");
        cancelation.setPrefWidth(120);
        cancelation.setOnAction(e -> controller.exit(this));

        getChildren().addAll(addItem, /* sellItem, */ cancelation);
        setAlignment(Pos.CENTER);
   }
}

控制器类:

public class Controller {

    public void exit(Node view) {
        view.getScene().getWindow().hide();
    }
}

申请类:

public class VendorManagementSystem extends Application {

    @Override
    public void start(Stage primaryStage) {

        Controller controller = new Controller();
        View view = new View(controller);

        Scene scene = new Scene(view);
        primaryStage.setHeight(450);
        primaryStage.setWidth(650);
        primaryStage.setTitle("Vendor Management System");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

显然,在实际应用程序中,除了视图和控制器类之外,还有一个数据模型。

您可以根据您想要的设置方式改变视图与控制器之间的关系,例如:您可以为控制器提供对视图的引用,在视图中定义getCancelationButton()方法,并在控制器中调用getCancelationButton().setOnAction(...),而不是为视图提供对控制器的引用。它只取决于您尝试实现的MVC的哪种变体。