首页 文章

JavaFX多个阶段没有关闭

提问于
浏览
1

我正在创建一个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 回答

  • 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();
    
    
    }
    

相关问题