我的代码包含一个 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),但仍未解决。
最佳答案
JFrame
和 JDialog
都继承了以下 Window
便捷方法:toFront()和 toBack() ,尽管 JDialog
从 Dialog
继承了后者。无论如何,尝试将其中任何一个与 WindowListener 结合使用。通过监听以下事件:windowActivated(WindowEvent e)和 windowDeactivited(WindowEvent e) .
编辑:
这是别人的suggested ,
attach a focus listener on the JDialog and when it loses focus, move it to the front of all the other windows. This will cause flickering and works pretty horribly.
关于java - Modal JDialog 在 Solaris CDE 上消失在父级后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5748090/