我的大部分编程经验都来自于C++。我正在学习Javafx中的许多优秀特性,但到目前为止,我最大的障碍是在用Javafx编写应用程序时是否使用了良好的编程实践。首先,我被教导要在C++中尽可能保持“主函数”的整洁,所以它主要包含我自己的类对象及其方法。在fx中工作时,这是不是一般的好做法?也就是说,在我的main类(包含start方法)之外创建许多类,然后将这些类的对象添加到start方法中?下面是一个示例:
此程序创建一个BorderPane,并在其顶部放置一个带有两个按钮的HBox。我用两种不同的方式写了这个程序。One -所有的方法都在主类中。2-我创建了一个单独的类,它实例化了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);
}
}然后在我的main函数中使用它:
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类的构造函数中实例化HBox,然后将它添加到main中的BorderPane中,我做错了什么?
我知道这很多,但如果有人能给我一些方向,我会非常感激。非常感谢!
发布于 2015-06-01 16:13:38
1)一般来说,每个视图引入一个类是很好的做法。如果你遵循这个建议,你的main函数在这个例子中将保持干净。在技术上不需要保持你的主函数的整洁,只需要以一种整洁和可维护的方式来组织你的代码。
这意味着在本例中创建:
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,这意味着您正在创建两个Box,这可能就是它看起来不同的原因。你想做的可能是:
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类的绑定。
https://stackoverflow.com/questions/30563634
复制相似问题