我想将屏幕从login.fxml
更改为home.fxml
。
我应该更改Stage
还是Scene
?我不确定哪种是最佳做法?
另外,我可以在控制器中为处理程序使用lambda表达式吗?
答案 0 :(得分:13)
首先,让我们从Stage
.vs开始。 Scene
问题:
众所周知,JavaFX
层次结构基于:Stage
- > Scene
- > Nodes
(等)。
见这里:
实际上,我认为一个经验法则是未来:
如果您计划在程序流程中转到其他地点(例如,登录 - >个人资料),请更改Stage
。
如果你在同一个环境(第一次登录 - >多次错误尝试后登录) - 更改Scene
。
至于lambdas :啊......如果你当前的Java
/ JavaFX
版本具有这种能力 - 没有理由不使用。
有关控制器处理程序的更多信息
Java 8,请参阅此great tutorial。
答案 1 :(得分:3)
我使用此方法更改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
变量中。然后,它将.fxml文件中的新Scene
对象加载到myNewScene
变量中,然后将这个新加载的Scene
对象放入已保存的Stage
对象中。
使用此代码,您可以使用基本的三个按钮菜单,其中每个按钮仅使用一个Stage
对象切换到不同的场景。