我的代码包含一个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),但仍未得到解决。
答案 0 :(得分:1)
JFrame
和JDialog
都继承了以下Window
便捷方法:toFront()和toBack(),尽管JDialog
从{Dialog
继承后者1}}。无论如何,请通过聆听以下事件尝试将其中任何一项与WindowListener结合使用:windowActivated(WindowEvent e)和windowDeactivited(WindowEvent e)。
修改强>
这是其他人suggested,
在JDialog上附加焦点监听器 当它失去焦点时,将其移动到 所有其他窗户的正面。 这将导致闪烁并起作用 非常可怕。