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

时间:2014-07-30 13:10:57

标签: java javafx

我创建了一个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生成的控制器类)中。我无法弄清楚框架的名称是什么,以便在控制器类中使用它。

非常感谢任何帮助!

6 个答案:

答案 0 :(得分:28)

在控制器类中为您的按钮命名:

@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" />

这将关闭此按钮所在的阶段。

答案 1 :(得分:6)

使用

stage.hide()

如果从控制器执行此操作,您可以从舞台场景内的任何Node获取舞台(如果需要,让FXML加载程序使用{{1}将一个分配给控制器的一个字段来自fxml中的fxml命名空间的属性:

id

答案 2 :(得分:5)

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

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

答案 3 :(得分:4)

感谢您抽出时间回复,但最后我发现了如何修复它。我用了

((Node)(event.getSource())).getScene().getWindow().hide();

if ,它负责成功登录。我的意思是,在出现一个对话框告知用户他们成功登录后,该代码就会出现。

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

答案 4 :(得分:0)

虽然

    getScene().getWindow();
Node上的

会让你从控制器进入舞台,重要的是要注意调用close()hide()是等效的,并且只会使登录窗口不可见。至于使用dispose()

This link might help to clear up any confusion.

答案 5 :(得分:0)

隐藏不会关闭窗口,只是处于可见模式。最好的解决方案是:

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