JavaFX несколько этапов не закрывается - PullRequest
0 голосов
/ 27 апреля 2018

Я создаю приложение JavaFX, которое имеет основную стадию, а затем вызывает другие методы для создания подокон (также этапов). Это отлично работает. Но кнопка закрытия подокна не работает, и я должен закрыть окно, используя «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 голосов
/ 27 апреля 2018

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


}
...