1

我有一个 JDialog,每当我的主应用程序收到事件时就会弹出。我面临的问题是即使主窗口最小化也会弹出对话框。此处提出了类似的问题,但没有给出有关如何解决此问题的答案,除了指向 sun 的焦点处理指南的链接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。但这不起作用。任何建议?

4

2 回答 2

2

使用 JFrame 的方法

public synchronized int getExtendedState()

e.g. PLAFHelper.getMainFrame().getExtendedState()

如果它是 JFrame.ICONIFIED 跳过对话框打开。

于 2011-04-18T12:55:23.093 回答
1

我遇到了同样的问题并搜索stackoverflow!最后,我发现

Markus Lausberg 在 JDialog 中回答的正确答案让主应用程序失去焦点

只需在对话框创建期间调用以下方法:

setFocusableWindowState(false); 可聚焦(假);

于 2012-04-24T15:52:10.830 回答