为什么我的jframe在关闭modal jdialog后会移到后台

k4emjkb1  于 2021-07-09  发布在  Java
关注(0)|答案(0)|浏览(219)

我在这个问题上跌跌撞撞,自己也找不到解决的办法,我真是迷路了。
说明:
我有一个应用程序,它有一个JavaSwingGUI。所有与gui的通信都是通过定制事件完成的,这些定制事件主要由主程序创建,然后由控制器处理以控制gui。
我遇到的一个事件将触发控制器打开一个定制的模态jdialog,它的作用就像“请稍候,后台的东西正在处理”。因此,在后台任务完成后,一个事件将触发对话框进行处置,以使主gui框架再次可访问。
问题是:
当对话框被释放时,主框架将神奇地设置为背景。不是最小化,不是完全在所有打开窗口的背景中,而是在最后一个打开窗口的背景中。我完全不知道这是怎么发生的,为什么发生的。
控制器类的重要部分大致如下所示:

class Controller {
    private ModalWaitDialog dialog;
    private JFrame frame;

    private void createMainFrame() {

        SwingUtilities.invokeAndWait(new Runnable() {

            @Override
            public void run() {
                // create frame
                frame = new JFrame();
                // make the frame visible
                frame.setVisible(true);
            }
        });
    }

    private void showWaitPopup(String msg) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                modalWaitDialog = new ModalWaitDialog(frame, message);
                modalWaitDialog.showDialog();
            }
        });
    }

    // after this was executed, my frame will be set in the background
    private void endWaitPopup() {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                if (modalWaitDialog != null) {
                    modalWaitDialog.dispose();
                    modalWaitDialog = null;
                }
            }
        });
    }
}

我知道这不是mcve,但也许有人知道这是怎么发生的,为什么会发生。
编辑:
我在框架中添加了一个windowfocuslistener,在endwaitpopup中添加了一些print语句,并调用了 invokeAndWait 进一步了解正在发生的事情。结果如下:

private void endWaitPopup() {
    System.out.println("In EndWaitPopup");
    try {
        SwingUtilities.invokeAndWait(new Runnable() {

            public void run() {
                System.out.println("EndWaitPopup... run started");
                // implement as if it could be called if no wait popup is available
                if (modalWaitDialog != null) {
                    System.out.println("Disposing the modal dialog");
                    modalWaitDialog.dispose();
                    modalWaitDialog = null;
                }
                System.out.println("End of EndWaitPopup");
            }
        });
    } catch (InvocationTargetException | InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

输出:

In EndWaitPopup
+++Focus of Frame lost+++
EndWaitPopup... run started
Disposing the modal dialog
End of EndWaitPopup

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题