我目前正在编写程序,并使用JavaFX作为主要的GUI设置。目前,当我进入每种方法时,我正在打开和关闭每个阶段。
对于用户来说,这有点烦人,因为他们在浏览程序时会打开和关闭许多屏幕。
我的问题是,有没有一种方法可以使我每次进入程序的不同部分时都不必打开舞台,而是可以在场景之间进行切换?在这种情况下,场景之间的切换是否正确?我需要在方法之间过渡吗?
正如您可能会告诉我的那样,我才刚刚开始使用JavaFX,因此希望能从中汲取一点教训。
编辑:我决定使用JavaFXML更新我的应用程序,但是我很难将场景传递到控制器中。这是我的控制器;
public class MainApp extends Application {
@FXML
public Stage primaryStage;
@FXML
private AnchorPane rootLayout;
@FXML
private JobInterface jInterface;
@Override
public void start(Stage primaryStage) {
primaryStage = new Stage();
setPrimaryStage(primaryStage);
initRootLayout();
}
@FXML
public void initRootLayout(){
try {
primaryStage = getPrimaryStage();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainApp.class.getResource("MainInterface.fxml"));
rootLayout = (AnchorPane) loader.load();
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
primaryStage.show();
setPrimaryStage(primaryStage);
} catch (IOException e) {
e.printStackTrace();
}
}
@FXML
private void setJobLayout(){
primaryStage = getPrimaryStage();
jInterface = new JobInterface();
jInterface.initJobLayout();
primaryStage.setScene(jInterface.getScene());
}
public static void main(String[] args) {
launch(args);
}
public Stage getPrimaryStage() {
return primaryStage;
}
public void setPrimaryStage(Stage primaryStage) {
this.primaryStage = primaryStage;
}
}
这是一种使用不同的FXML文件更改场景,然后尝试将场景传递回控制器的方法。
public class JobInterface {
private AnchorPane rootLayout;
private Scene scene;
public void initJobLayout(){
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainApp.class.getResource("JobInterface.fxml"));
rootLayout = (AnchorPane) loader.load();
scene = new Scene(rootLayout);
setScene(scene);
} catch (IOException e) {
e.printStackTrace();
}
}
public Scene getScene() {
return scene;
}
public void setScene(Scene scene) {
this.scene = scene;
}
}
我现在遇到的问题是主应用程序中此行上的NullPointerException。
primaryStage.setScene(jInterface.getScene());
关于我要去哪里的任何想法?
是的,您可以保留JavaFX在初始化时提供的主要阶段,并为不同的UI"页面"更改其场景。或者,由于场景只有一个根节点布局,因此您甚至可以使用同一场景并在不同的"页面"上更改其根节点。在这两种情况下,请不要忘记导航到新的"页面"后调用primaryStage.sizeToScene()。
所以我只需要通过每种方法来完成一下阶段?可以正常工作吗?示例:uInterface.UserUI(connection,primaryStage);
有不同的方法。有些人将主要阶段保持为公共静态并直接访问它。有些人通过(在控制器类中)anynode.getScene()获得场景,或通过anynode.getScene()。getWindow()进行舞台演出。
@jbanks是的,可以正常工作。或者,您可以在UserInterface类中定义getScene()方法,返回其创建的Scene,然后在登录按钮处理程序中执行primaryStage.setScene(uInterface.getScene())。有很多方法...
@James_D,我已经编辑了上面的问题以针对我遇到的FXML问题进行修改
非动画
要在没有动画教程的情况下更改场景:
http://docs.oracle.com/javafx/2/api/javafx/stage/Stage.html#setScene%28javafx.scene.Scene%29
http://docs.oracle.com/javafx/2/api/javafx/scene/layout/Pane.html#getChildren%28%29
动画的
使用动画教程更改场景:
https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx1
https://blogs.oracle.com/acaicedo/entry/managing_multiple_screens_in_javafx
链接不再起作用。