我正在创建一个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语句。 我花了很多时间阅读各种选项。 感谢所有的帮助。
答案 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();
}