Modal JDialog 在 Solaris CDE 上消失在父级后面

发布于 2024-11-02 21:48:29 字数 1182 浏览 3 评论 0原文

我的代码包含一个 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) 上运行任何其他窗口管理器时,不会出现此问题。类似的问题已经被问过一段时间了(如何使无模式对话框在 Solaris CDE 中保持在其父级之上),但该问题仍未解决。

My code contains a JFrame which after a certain action, shows a non-modal JDialog. The user is expected to drag an object from the JFrame into the JDialog. The issue I'm having is only showing up on Solaris CDE (Common Desktop Environment): opening JDialog correctly positions the window on top of the frame. After the user clicks on the frame, dialog disappears behind it forcing the user to re-position the frame to put it besides JDialog. The expected behavior is for the JDialog to remain on top of the parent frame.

The following code demonstrates the situation:

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);


    }
}

This problem is not when running any other window manager on solaris as well as windows and linux (GNOME). A similar question has been asked some time ago (How to make modeless dialog stay on top of its parent in Solaris CDE), but it remains unresolved.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

红ご颜醉 2024-11-09 21:48:29

JFrameJDialog 都继承了以下 Window 便捷方法:toFront()toBack(),尽管 JDialog继承了后者对话框。无论如何,尝试将其中任何一个与 结合使用WindowListener 通过侦听以下事件: windowActivated(WindowEvent e)windowDeactivited(WindowEvent e)

编辑:

这是别人的

在 JDialog 上附加焦点侦听器
当它失去焦点时,将其移动到
所有其他窗户的前面。
这会导致闪烁和工作
非常可怕。

Both JFrame and JDialog inherit the following Window convenience methods: toFront() and toBack(), although JDialog inherits the latter from Dialog. Anyway, try using either of those in combination with a WindowListener by listening for the following events: windowActivated(WindowEvent e) and windowDeactivited(WindowEvent e).

Edit:

This what someone else 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文