如何通过单击按钮关闭java窗口-JavaFX项目

如何通过单击按钮关闭java窗口-JavaFX项目,java,javafx,Java,Javafx,我制作了一个JavaFX项目,并为java场景生成器中的第一个登录帧创建了GUI。登录成功后,必须关闭登录框架,并且下一个框架必须可见(主程序框架)。我可以使新框架出现,但无法关闭登录框架。我尝试了类似于dispose()的方法,但没有任何效果。以下是主类的代码: public class KuberComm extends Application { @Override public void start(Stage stage) throws Exception {

我制作了一个JavaFX项目,并为java场景生成器中的第一个登录帧创建了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
public Button closeButton;
并添加此方法:

@FXML
public void handleCloseButtonAction(ActionEvent event) {
    Stage stage = (Stage) closeButton.getScene().getWindow();
    stage.close();
}
在FXML中,需要引用按钮名称和调用onAction的方法:

<Button fx:id="closeButton" cancelButton="true" layoutX="350.0" layoutY="767.0" mnemonicParsing="false" onAction="#handleCloseButtonAction" prefWidth="100.0" text="Close" />

这将关闭此按钮所在的舞台。

使用

stage.hide()
如果从控制器执行此操作,则可以从舞台场景中的任何
节点
获取舞台(如有必要,让FXML加载器使用FXML中FXML名称空间的
id
属性将一个指定给控制器的字段):

虽然

    getScene().getWindow();
节点上
将从控制器获得舞台,需要注意的是调用
close()
hide()
是等效的,只会使登录窗口不可见。关于使用
dispose()


感谢您抽出时间回复,但最后我找到了解决方法。我曾经

((Node)(event.getSource())).getScene().getWindow().hide();
中,如果
它负责成功登录。我的意思是,在出现一个对话框,通知用户他们成功登录后,代码就会出现


(我也输入了正确的东西,以使这行代码正常工作)

与其他答案类似,但更精确

@FXML
public void handleCloseButtonAction(ActionEvent event) {
    ((Stage)(((Button)event.getSource()).getScene().getWindow())).close();
}

隐藏不会关闭窗口,只是将其置于可见模式。最好的解决办法是:

@FXML
private void exitButtonOnAction(ActionEvent event){
        ((Stage)(((Button)event.getSource()).getScene().getWindow())).close();      
}

根据@kervin的文档,stage.close()相当于Window.hide(),那又怎样???两者都关闭阶段,但如果使用最后一个代码段访问阶段,则使用
hide()
不需要强制转换。这正是OP要求的,不是吗???如果我使用此方法,
Platform.runLater()
将不再运行来自此特定控制器的任何
Runnable
。别问我为什么。也许这个答案很有用。过来看。出于某种原因,我不得不将按钮转换为节点转换,但在其他情况下效果很好。@CJF,我猜您没有导入
按钮
@FXML
private void exitButtonOnAction(ActionEvent event){
        ((Stage)(((Button)event.getSource()).getScene().getWindow())).close();      
}