我在这个问题上跌跌撞撞,自己也找不到解决的办法,我真是迷路了。
说明:
我有一个应用程序,它有一个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
暂无答案!
目前还没有任何答案,快来回答吧!