Javafx良好的编程实践

时间:2015-05-31 23:06:24

标签: java javafx

我的大部分编程经验都是用C ++编写的。我在Javafx中学到了很多很棒的功能,但到目前为止我遇到的最大障碍是我是否在Javafx中编写应用程序时使用了良好的编程实践。主要是,我被教导要保持​​"主要功能"尽管在C ++中尽可能干净,但它主要包含我自己的类对象及其方法。在fx工作时,这是一般的好习惯吗?即在我的主类之外创建一些类,其中包含start方法,然后将这些类的对象添加到start方法中?这是一个例子:

该程序创建一个BorderPane,并在其顶部放置一个带有两个按钮的HBox。我用两种不同的方式编写了程序。一个 - 所有方法都在Main类中。二 - 我创建了一个单独的类,它实例化HBox,然后在Main中使用它。

1

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) 
    {
        BorderPane border = new BorderPane();
        HBox hbox = addHBox();
        border.setTop(hbox);

        Scene scene = new Scene (border, 540,680);
        primaryStage.setScene(scene);
        primaryStage.show();

    }
    public HBox addHBox()
    {
        HBox hb = new HBox();
        hb.setPadding(new Insets(15,12,15,12));
        hb.setSpacing(10);
        hb.setStyle("-fx-background-color: #336699;");

        Button btnCurrent = new Button("Current");
        btnCurrent.setPrefSize(100, 20);
        btnCurrent.setStyle("-fx-font: 12 times; -fx-base: #b6e7c9;");

        Button btnProjected = new Button("Projected");
        btnProjected.setPrefSize(100,20);
        btnProjected.setStyle("-fx-font: 12 times; -fx-base: #b6e7c9;");

        hb.getChildren().addAll(btnCurrent,btnProjected);
        hb.setAlignment(Pos.CENTER);
        return hb;
    }

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

2

我创建了一个名为Box的小组:

public class Box extends HBox{


HBox hb = new HBox();
    public Box()
    {

        hb.setPadding(new Insets(15,12,15,12));
        hb.setSpacing(10);
        hb.setStyle("-fx-background-color: #336699;");

        Button btnCurrent = new Button("Current");
        btnCurrent.setPrefSize(100, 20);
        btnCurrent.setStyle("-fx-font: 12 times; -fx-base: #b6e7c9;");

        Button btnProjected = new Button("Projected");
        btnProjected.setPrefSize(100,20);
        btnProjected.setStyle("-fx-font: 12 times; -fx-base: #b6e7c9;");

        hb.getChildren().addAll(btnCurrent,btnProjected);
        hb.setAlignment(Pos.CENTER);

        getChildren().add(hb);
    }

}

然后在我的主要功能中使用它:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) 
    {
        BorderPane border = new BorderPane();
        Box hbox = new Box();
        border.setTop(hbox);

        Scene scene = new Scene (border, 540,680);
        primaryStage.setScene(scene);
        primaryStage.show();

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

这是我的主要问题,但是,如果第二种风格(创建自己的类并在主类中使用它们)确实是要走的路,使用我的具体示例,它将HBox放在一个奇怪的地方,看起来并不正确。通过在我的Box Class中实例化HBox,我做错了什么?构造函数然后将它添加到main中的BorderPane?

我知道很多,但如果有人可以给我一些方向,我会非常感激。非常感谢!

1 个答案:

答案 0 :(得分:0)

1) 通常,每个视图引入一个类是一个好习惯。如果您遵循该建议,则此示例中的主要功能将保持清洁。没有技术需要保持主要功能的清洁,只需要以干净和可维护的方式组织代码。

这意味着在这种情况下创建:

public class PrimaryView extends BorderPane {
    public PrimaryView() { .... }
}

然后在你的申请中:

public void start(Stage primaryStage) {
    Scene scene = new Scene (new PrimaryView(), 540,680);
    primaryStage.setScene(scene);
    primaryStage.show();
}

2) 在你的Box类中,你将HBox添加到HBox,这意味着你创建了2个盒子,这可能就是它看起来不同的原因。你打算做的可能是:

public class Box extends HBox {

    public Box() {

        this.setPadding(new Insets(15,12,15,12));
        this.setSpacing(10);
        this.setStyle("-fx-background-color: #336699;");

        ...

        // no need
        //getChildren().add(hb);
    }
 }

3) 使用JavaFX的一大优势是SceneBuilder和带有CSS文件的FXML用于样式化。起初它有点复杂,但你会习惯它。

一个非常有趣的框架是AfterburnerFX,它带有一个很好的例子。初学者并不容易理解,但展示了如何组织代码和应用程​​序。专注于FXML和View类的绑定。