Modal JDialog在solaris CDE上的父母身后消失

时间:2011-04-21 18:12:54

标签: java swing solaris

我的代码包含一个JFrame,它在某个动作之后显示一个非模态的JDialog。期望用户将对象从JFrame拖动到JDialog中。我遇到的问题只出现在Solaris CDE(公共桌面环境)上:打开JDialog正确地将窗口定位在框架顶部。在用户点击框架后,对话框消失在其后面,迫使用户重新定位框架以将其放置在JDialog之外。预期的行为是JDialog保持在父框架之上。

以下代码演示了这种情况:

public class MyFrame extends JFrame
{

    public MyFrame()
    {
        JButton btn = new JButton("Push me");
        btn.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                JDialog dialog = new JDialog(MyFrame.this);
                dialog.getContentPane().add(new JLabel("I'm a dialog!!!"));
                dialog.setAlwaysOnTop(true);
                dialog.setVisible(true);
            }

        });

        getContentPane().add(btn);
        pack();
    }

    public static void main(String args[])
    {
        MyFrame frame = new MyFrame();

        frame.setVisible(true);


    }
}

在solaris以及Windows和Linux(GNOME)上运行任何其他窗口管理器时,不会出现此问题。前段时间曾提出过一个类似的问题(How to make modeless dialog stay on top of its parent in Solaris CDE),但仍未得到解决。

1 个答案:

答案 0 :(得分:1)

JFrameJDialog都继承了以下Window便捷方法:toFront()toBack(),尽管JDialog从{Dialog继承后者1}}。无论如何,请通过聆听以下事件尝试将其中任何一项与WindowListener结合使用:windowActivated(WindowEvent e)windowDeactivited(WindowEvent e)

修改

这是其他人suggested

  

在JDialog上附加焦点监听器   当它失去焦点时,将其移动到   所有其他窗户的正面。   这将导致闪烁并起作用   非常可怕。