每当我的主应用程序收到一个事件时,我都会弹出一个JDialog。
我面临的问题是,即使主窗口最小化,对话框也会弹出。这里也提出了一个类似的问题,但没有给出如何解决这个问题的答案,除了指向关于焦点处理的太阳指南的链接Hide JDialog window when the window lost focus。
假设我有函数createandshowDialog(),例如
public void createAndShowDialog(boolean manualLaunch) {
if (manualLaunch || shouldShowMessage()) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (dialog == null) {
dialog = new xyzDialog(getPendingList());
}
GUIHelper.flash(PLAFHelper.getMainFrame(), true, false);
dialog.setVisible(true);
}
});
}
}
xyzDialog类定义为:
public class xyzDialog extends SimpleStandardDialog
{
protected final static Log logger = LogFactory.getLog(xyzDialog.class);
private xyzPanel panel;
public xyzDialog(ObjectArrayList list) {
super(PLAFHelper.getMainFrame(), "Pending Cancel/Replace");
initializeLocalVars();
panel = new xyzPanel(list, mediator);
super.setSize(750,600);
setResizable(true);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setModal(false);//todo: for testing...
if(PUMAGUIOptions.cFocusOnxyzPopup){
setFocusableWindowState(true);
validate();
}
else{
setFocusableWindowState(false);
validate();
}
}
默认行为应该是这样,如果主窗口被最小化它不应该弹出,或者我们明确地将cFocusOnxyzPopup设置为false以强制执行此默认行为(在辅助监视器上打开它并且我们正在处理主要操作时就是这种情况监视器或应用程序最大化或处于后台,即不是focusOwner 我将focusableWindowState设置为false,这样它就不能满足获得焦点的条件,如果在java-docs中给出调用,则将isFocusable返回为false。但这不起作用。有什么建议吗?
答案 0 :(得分:2)
使用JFrame的方法
public synchronized int getExtendedState()
e.g. PLAFHelper.getMainFrame().getExtendedState()
如果它是JFrame.ICONIFIED则跳过对话框打开。
答案 1 :(得分:1)
我遇到了同样的问题并搜索了stackoverflow!最后,我找到了
Markus Lausberg回答了正确答案 JDialog lets main application lose focus在对话框创建期间调用以下方法:
setFocusableWindowState(假); setFocusable(假);