Java 每扇窗户只开一次

Java 每扇窗户只开一次,java,javafx,Java,Javafx,我有一张图表。双击表格行将打开一个窗口,我可以在其中编辑该行的信息。双击另一行将打开相应的窗口。除了每个窗口只能打开一次之外,一切都正常工作。如果已经打开,窗口应返回前台。不幸的是,我看不出这里出了什么问题,如果您能给我一个提示,我将不胜感激 private void loadTable() { // I omitted the part where the table is populated. mytable.setOnMousePressed(new EventHand

我有一张图表。双击表格行将打开一个窗口,我可以在其中编辑该行的信息。双击另一行将打开相应的窗口。除了每个窗口只能打开一次之外,一切都正常工作。如果已经打开,窗口应返回前台。不幸的是,我看不出这里出了什么问题,如果您能给我一个提示,我将不胜感激

private void loadTable() {

    // I omitted the part where the table is populated.

    mytable.setOnMousePressed(new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {

            if (event.isPrimaryButtonDown() && event.getClickCount() == 2) {

                TableItem table_item = table_view.getSelectionModel().getSelectedItem();

                try {

                    FXMLLoader fxmlLoader = new FXMLLoader();
                    fxmlLoader.setLocation(getClass().getResource("/application/Popup.fxml"));

                    Scene scene = new Scene(fxmlLoader.load());
                    Stage stage = new Stage();   
                    stage.setScene(scene);
                    MyController controller = fxmlLoader.<MyController>getController();
                    boolean result = controller.init(stage, table_item);              

                    if (stage.isShowing()) {
                        stage.toFront();
                        System.out.println("Show this popup.");
                    } else {                        
                        if (result) {                                   
                            stage.show();
                            System.out.println("Open this popup.");
                        }
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
    });
}
private void loadTable(){
//我省略了填充表格的部分。
setOnMousePressed(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
if(event.isPrimaryButtonDown()&&event.getClickCount()==2){
TableItem table_item=table_view.getSelectionModel().getSelectedItem();
试一试{
FXMLLoader FXMLLoader=新的FXMLLoader();
setLocation(getClass().getResource(“/application/Popup.fxml”);
场景=新场景(fxmloader.load());
阶段=新阶段();
舞台场景;
MyController controller=fxmloader.getController();
布尔结果=controller.init(stage,table_项);
if(stage.isShowing()){
stage.toFront();
System.out.println(“显示此弹出窗口”);
}否则{
如果(结果){
stage.show();
System.out.println(“打开这个弹出窗口”);
}
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
});
}
尝试添加

stage.initModality(Modality.WINDOW_MODAL);
之后


这将使父级阶段在该阶段关闭之前不可访问。

每次鼠标处理程序执行时,您都将创建一个新的
阶段
。您说您只想在用户第一次双击表中的特定行时创建它。您认为您可以如何管理它?我唯一的建议是保存您打开窗口的行数。每次单击时,您都会将数字与打开的窗口的数字列表进行比较,如果没有找到,则创建,否则将其带到前台(我不知道如何操作)。您可以通过在类中创建一个stage字段来实现这一点。在事件处理程序中,您需要做的第一件事是检查null if null创建必要的内容if not null检查if show if so pull to front else show stage您可以创建一个范围为整个类的布尔变量。如果弹出窗口已经打开,请使用它来跟踪。如果是,请先关闭旧窗口,然后再打开新窗口。创建一个项目,我将对此进行调查。
Stage stage = new Stage();