2015-05-31 92 views
1

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

这个程序创建一个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.

我创建了一个名为盒类:

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类的构造函数中实例化了HBox,然后将它添加到我的BorderPane中,从而导致我做错了什么?

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

+0

虽然第二种方法比较好,因为在各种答案中已经说过,但我想指出一个最佳做法是为所有样式选项创建一个单独的“css文件”。 – ItachiUchiha

回答

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类的绑定。

+0

谢谢,我很欣赏它,我会研究一下 –

+0

还要考虑即使使用每个视图模式中的一个类,您的类也不必为“窗格”创建子类。例如。 'public class Box {/ * ... */public Parent getView(){return ...;}/* ... * /}'。我发现这个变体使我的代码比继承'Pane'(或其他'Node')类更清晰。 –