我想将 UI 屏幕从
login.fxml
更改为 home.fxml
。
我应该更改
Stage
还是 Scene
?我不确定哪个是最佳实践?
另外,我可以在控制器中的处理程序中使用 lambda 表达式吗?
首先,让我们从
Stage
.vs 开始。 Scene
问题:
众所周知,
JavaFX
层次结构基于:Stage
-> Scene
-> Nodes
(等等)。
看这里:
实际上来说,我认为的经验法则是未来:
如果您计划在程序流程中转到不同的地方(例如登录 -> 个人资料) - 更改
Stage
。 如果您处于相同的环境(首次登录->多次错误尝试后登录)-更改
Scene
。至于 lambdas:啊嗯...如果您当前的
Java
/JavaFX
版本具有该功能 - 没有理由不使用。
有关控制器处理程序的更多信息,请参见
Java 8,请参阅这个很棒的教程。
我使用这种方法来改变
JavaFX
中的场景:
/**
* Controller class for menuFrame.fxml
*/
public class MenuFrameControl implements Initializable {
@FXML private Button sceneButton1;
@FXML private Button sceneButton2;
@FXML private Button sceneButton3;
/**
* Event handling method, loads new scene from .fxml file
* according to clicked button and initialize all components.
* @param event
* @throws IOException
*/
@FXML
private void handleMenuButtonAction (ActionEvent event) throws IOException {
Stage stage = null;
Parent myNewScene = null;
if (event.getSource() == sceneButton1){
stage = (Stage) sceneButton1.getScene().getWindow();
myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene1.fxml"));
} else if (event.getSource() == sceneButton2){
stage = (Stage) flightBtn.getScene().getWindow();
myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene2.fxml"));
} else if (event.getSource() == sceneButton3) {
stage=(Stage) staffBtn.getScene().getWindow();
myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene3.fxml"));
}
Scene scene = new Scene(myNewScene);
stage.setScene(scene);
stage.setTitle("My New Scene");
stage.show();
}
@Override
public void initialize(URL location, ResourceBundle resources) { }
所以基本上,当您单击按钮时,它会将实际显示的
Stage
对象保存到 stage
变量中。然后它将新的 Scene
对象从 .fxml 文件加载到 myNewScene
变量中,然后将这个新加载的 Scene
对象放入您保存的 Stage
对象中。
使用此代码,您可以制作基本的三按钮菜单,其中每个按钮切换到不同的场景,仅使用单个
Stage
对象。
如果您没有特殊原因打开另一个窗口(对话框除外),我更愿意交换场景的根父级。例如:
stage.getScene().setRoot(newParent);
不知道为什么,过渡过程中好像更流畅了。每当我交换场景时,我的应用程序都会闪烁黑色一秒钟。但通过交换它的根,我没有闪烁。