JavaFX多个阶段没有关闭

时间:2018-04-27 16:31:17

标签: javafx stage

我正在创建一个JavaFX应用程序,它有一个主Stage然后调用其他方法来创建子窗口(也是阶段)。这很好用。但子窗口的关闭按钮不起作用&我必须使用右上角的“X”关闭窗口。 似乎根本没有调用事件处理程序。

以下子窗口的主要摘录:

格式化道歉 - 似乎没有正确翻译..

    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    import javafx.scene.text.Font;
    import javafx.stage.Stage;
    import javafx.scene.layout.FlowPane;
    import javafx.scene.control.Button;
    import javafx.geometry.Pos;
    import javafx.scene.text.TextAlignment;
    import javafx.stage.Modality;

    /**
     * Provides a Treasury Report & displays balances until a Button is pressed
     *
     * @author (your name)
     * @version (a version number or a date)
     */
    public class TreasuryReport extends Stage
    {
        /**
         * Constructor for objects of class TreasuryReport
         */
        public void ShowTreasuryReport(int acBalance, int mthCosts, int swissAcc)
        {
            Stage treasuryStage = new Stage();
            treasuryStage.setTitle("Treasury Report");
            treasuryStage.initModality(Modality.WINDOW_MODAL);
            int absBalance = acBalance;
            Button closeButton = new Button ("Close Report"); 

还有其他位我创建了一个显示的标签

    VBox layout1 = new VBox(20);     
    layout1.setAlignment(Pos.CENTER);
    layout1.getChildren().addAll(label1, closeButton);
    Scene TRScene = new Scene(layout1, 300, 250);
    treasuryStage.setScene(TRScene);
    treasuryStage.showAndWait();

    closeButton.setOnAction(new EventHandler<ActionEvent>() 
        {
            public void handle(ActionEvent e) {
                System.out.println("TR button pressed");
                treasuryStage.hide();
                treasuryStage.close();
            }
        });
}

我尝试了很多不同的选项,似乎没有任何效果。 看起来按钮甚至没有进入事件处理程序,因为没有生成println语句。 我花了很多时间阅读各种选项。 感谢所有的帮助。

1 个答案:

答案 0 :(得分:1)

顾名思义,

showAndWait()显示阶段,然后等待(阻止执行)直到阶段关闭。因此,您不会使用按钮注册处理程序,直到该阶段已经关闭。

只需更改代码的执行顺序:

public void ShowTreasuryReport(int acBalance, int mthCosts, int swissAcc) {
    Stage treasuryStage = new Stage();
    treasuryStage.setTitle("Treasury Report");
    treasuryStage.initModality(Modality.WINDOW_MODAL);
    int absBalance = acBalance;
    Button closeButton = new Button ("Close Report"); 

    closeButton.setOnAction(event ->  {
        System.out.println("TR button pressed");
        treasuryStage.hide();
    });

    VBox layout1 = new VBox(20);     
    layout1.setAlignment(Pos.CENTER);
    layout1.getChildren().addAll(label1, closeButton);
    Scene TRScene = new Scene(layout1, 300, 250);
    treasuryStage.setScene(TRScene);
    treasuryStage.showAndWait();


}