我的大部分编程经验都是用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?
我知道很多,但如果有人可以给我一些方向,我会非常感激。非常感谢!
答案 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类的绑定。