你能把两个不同的Java FX场景写成两个独立的类吗?

时间:2016-04-11 14:22:19

标签: java javafx scene stage

我是一名初级Java程序员,完成了#101; Java 101"在我当地的大学上课。我也在努力学习一些额外的主题,包括Java FX。我已经在Oracle网站上完成了Java FX教程,还有一些YouTube视频,还有阅读" Java FX for Dummies" (这是我能为初学者找到的最好的书。)所有这些材料都教会了我很多基础知识,但是(应该)相对简单的一些东西让我感到厌烦。

例如:假设我有一个在一个舞台上使用多个场景的Java FX程序。当用户点击" Switch!"按钮,第二个场景换出第一个。简单。我可以在一个.java文件中完成所有这些,没问题。 (见下面的代码)

但是我的.java类文件变得非常冗长而且很麻烦。如果我可以将一个场景定义/声明/初始化为一个.java文件中的一个类而将另一个场定义为另一个.java文件中的另一个类,那将会很棒。这将使得更加容易地跟踪每个场景的组件。问题是,我无法弄清楚如何做到这一点。

我想你会编写一个Scene1.java类,然后编写一个Scene2.java类,当你想要切换场景时,只需在两者之间传递舞台对象。但我无法找到一个如何完成此操作的示例,我的所有尝试都会导致编译器错误或实际上可怕的运行时错误。

有谁知道如何做到这一点?如果是这样,我需要做些什么才能修改下面的SwitchScenes2()方法来创建新的Scene2对象并将其传递给舞台?

谢谢! RAO

/*
    JavaFXExample.java
*/

import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.event.*;
import javafx.geometry.*;

public class JavaFXExample extends Application{

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

Button btnSw1;
Button btnSw2;
Button btnClose;
HBox hbox1;
VBox vbox1;
Scene scene1;
Scene scene2;
Stage stage;

@Override public void start(Stage primaryStage){
    btnSw1 = new Button("Switch Scenes!");
    btnSw1.setOnAction(
        e -> SwitchScenes2() );
    btnSw2 = new Button("Switch back!");
    btnSw2.setOnAction(
        e -> SwitchScenes1() );
    btnClose = new Button();
    btnClose.setText("Close me!");
    btnClose.setOnAction(e -> CloseWindowClick());

    hbox1 = new HBox(10);
    hbox1.getChildren().addAll(btnSw1);
    vbox1 = new VBox(10);
    vbox1.getChildren().addAll(btnSw2, btnClose);

    scene1 = new Scene(hbox1, 300, 300);
    scene2 = new Scene(vbox1, 200, 400);

    stage = primaryStage;
    stage.setScene(scene1);
    stage.setTitle("Example App");
    stage.show();
   }

    public void SwitchScenes1(){
        stage.setScene(scene1);
    }
    public void SwitchScenes2(){
        stage.setScene(scene2);
    }
    public void CloseWindowClick(){
        stage.close();
    }
}

3 个答案:

答案 0 :(得分:1)

您要做的是创建单独的类,这两个类都具有返回场景的功能。从那里你需要初始化这些类,并使用按钮调用一个函数,该函数将向这些场景添加数据或创建一个新的空白场景(作为“删除”场景的快速方法)。但是如果你想要一种更专业的方式在这样的场景之间切换,你会想要查看TabPane()。

Scene1 scene1 = new Scene1();
Scene2 scene2 = new Scene2();

TabPane tabPane = new TabPane();
Tab tab1 = new Tab();
tab1.setContent(scene1);
tabPane.getTabs().add(tab1);
Tab tab2 = new Tab();
tab2.setContent(scene2);
tabPane.getTabs().add(tab2);

答案 1 :(得分:1)

  1. 创建一个包含main方法&amp ;;的Manager类。初始化第一个屏幕。例如。
  2. 公共类VMCSManager扩展了Application {

    private Parent content;
    private static VMCSManager instance;
    
    public VMCSManager() {
        instance=this;
    }
    
    public static void main(String[] args) {    
        launch(args);
    }
    
    public static VMCSManager getInstance() {
        return instance;
    }
    
    @Override
    public void start(Stage primaryStage) throws Exception {    
        initializePanel();  
        Scene scene = new Scene(content);
        stageStyle(primaryStage);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    private void initializePanel() throws IOException{
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("fxml/SimulatorDisplay.fxml"));
        content = loader.load(); 
    }
    
    public void openCustomerPanel() throws IOException{
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("fxml/CustomerDisplay.fxml"));
        content = loader.load(); 
        Scene scene = new Scene(content);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    }

    1. 为第一个屏幕创建主控制器类。例如;
    2. 公共类SimulatorController实现Initializable {

      @FXML
      public void clickCustomer (ActionEvent event) throws IOException{
          log.info("Starting Customer Panel");
          VMCSManager.getInstance().openCustomerPanel();
      }
      @FXML
      public void clickMaintainer(ActionEvent event) throws IOException{
          log.info("Starting Maintainer Panel");
          VMCSManager.getInstance().openMaintainerPanel();
      }
      

      }

      1. 最后为指定的屏幕创建控制器类。 eg`
      2. 公共类CustomerController扩展了SimulatorController {

        @FXML
        private Label brand1Lbl;
        @FXML
        private Label brand2Lbl;
        @FXML
        private Label brand3Lbl;
        @FXML
        private Label brand4Lbl;
        @FXML
        private Label brand5Lbl;
        
        @FXML
        private Label statusLbl1;
        @FXML
        private Label statusLbl2;
        
        private static final Logger log=LoggerFactory.getLogger(CustomerController.class);
        
        public CustomerController() {
            context= new BuyingStateContext();
        }
        
        public void initialize(URL location, ResourceBundle resources) {
             this.location = location;
             this.rb = resources;
             coinsValidityFlash.setVisible(false);
             insertCoinTxt.setDisable(true);
        
             brand1Btn.setStyle("-fx-background-color:  #CACACA;");
             brand2Btn.setStyle("-fx-background-color:  #CACACA;");
             brand3Btn.setStyle("-fx-background-color:  #CACACA;");
             brand4Btn.setStyle("-fx-background-color:  #CACACA;");
             brand5Btn.setStyle("-fx-background-color:  #CACACA;");
        
             populateVending();
        }
        .
        .
        .
        

        }

        `

答案 2 :(得分:1)

Pete我理解你希望将一个大的java文件分成小文件,在每个类中创建Java类创建方法(函数)将返回布局(HBox,VBox,Flowpane或....)然后在你的主创建该Java类的对象,并使用这些方法构建大型应用程序。

在我的示例中,我用一个函数创建了一个main和一个单独的类,只是为了向您展示它的工作原理。在我的主要有2个标签,2个按钮一个布局和一个分离类的对象,通过单击按钮场景将改变 我的主要:

public class SwitchSceneSample extends Application {
public static void main(String[] args) {
    launch(args);
}

Stage window;
Scene scene1, scene2;

@Override
public void start(Stage primaryStage) throws Exception {
    // I am using window as primaryStage
    window = primaryStage;
    // Label 1
    Label label1 = new Label("Welcome to the first scene!");
    // Label 2
    Label label2 = new Label("This is second scene!");
    // Button 1, by pressing this button primaryStage will be set as scene 2
    Button button1 = new Button("Go to scene 2");
    button1.setOnAction(e -> window.setScene(scene2));
    // Button 2, by pressing this button primaryStage will be set as scene 1
    Button button2 = new Button("Click to go scene 1");
    button2.setOnAction(e -> window.setScene(scene1));
    // Creating an object of the class'LayoutOne.java'
    LayoutOne l1 = new LayoutOne();
    // set my scene 1(by calling method called 'sceneView1()' from class 'LayoutOne.java')
    scene1 = new Scene(l1.sceneView1(label1, button1), 200, 200);
    // Set my scene 2 inside my main class
    StackPane layout2 = new StackPane();
    layout2.getChildren().addAll(label2, button2);
    scene2 = new Scene(layout2, 600, 300);
    // Making my 
    window.setScene(scene1);
    window.setTitle("Scene Switch Sample");
    window.show();
}

}

我的第二课:

public class LayoutOne {
public VBox sceneView1(Label label, Button button) {

    // Layout 1 - children are laid out in vertical column
    VBox layout1 = new VBox(20);
    layout1.getChildren().addAll(label, button);

    return layout1;
}

}