我创建了一个JavaFX项目,并在Java Scene Builder中为第一个登录框架创建了GUI。成功登录后,必须关闭登录框架,并且下一个框架必须可见(主程序框架)。我可以使新框架出现,但不能使登录框架关闭。我尝试了dispose()之类的东西,但没有任何效果。下面是主类的代码:
public class KuberComm extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setResizable(false);
stage.setTitle("Login to KuberComm");
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
登录按钮的处理程序位于另一个类(由NetBeans IDE制成的控制器类)中。我无法弄清楚框架的名称是什么,以便在控制器类中使用它。
任何帮助将不胜感激!
也许这个答案很有用。看看这个。通过控制器关闭fxml窗口
在控制器类中给按钮命名:
@FXML
public Button closeButton;
并添加此方法:
@FXML
public void handleCloseButtonAction(ActionEvent event) {
Stage stage = (Stage) closeButton.getScene().getWindow();
stage.close();
}
在FXML中,您需要引用按钮名称和调用onAction的方法:
这将关闭此按钮处于打开状态的阶段。
如果使用此方法,Platform.runLater()将不再运行来自此特定控制器的任何Runnable。不要问我为什么。
与其他答案类似,但更精确。
@FXML
public void handleCloseButtonAction(ActionEvent event) {
((Stage)(((Button)event.getSource()).getScene().getWindow())).close();
}
由于某些原因,我不得不将Button强制转换为Node强制转换,但否则可以正常工作。
使用
stage.hide()
如果从控制器执行此操作,则可以从舞台场景内的任何Node中获取舞台(如有必要,请FXML加载器使用的id属性将一个分配给控制器的字段) fxml中的fxml命名空间):
Window stage = node.getScene().getWindow();
根据文档docs.oracle.com/javase/8/javafx/api/javafx/stage/…,stage.close()等同于Window.hide()。
@kervin那又怎样呢?两者都会关闭该阶段,但是如果使用最后一个代码段访问该阶段,则使用hide()不需要强制转换。这正是手术医生问的,不是吗???
感谢您的答复,但最后我找到了解决方法。我用
((Node)(event.getSource())).getScene().getWindow().hide();
中的
表示成功登录。我的意思是,在出现对话框通知用户成功登录之后,该代码就在那里了。
(为了使该行代码正常工作,我也导入了正确的内容)
隐藏不会关闭窗口,只是处于可见模式。最好的解决方案是:
@FXML
private void exitButtonOnAction(ActionEvent event){
((Stage)(((Button)event.getSource()).getScene().getWindow())).close();
}
尽管
getScene().getWindow();
在Node上的
将带您进入控制器的舞台,请务必注意,调用close()或hide()是等效的,并且只会使登录窗口不可见。至于使用dispose():
此链接可能有助于清除任何混乱。