Windows在全屏未修饰的JFrame后面消失

时间:2016-04-05 17:06:31

标签: java linux swing jframe rhel

我有一个JFrame,我设置为全屏,如下所示:

JFrame frame = new JFrame();
frame.setSize(1920, 1080); // Resolution of the monitor
frame.setUndecorated(true);
frame.setVisible(true);

问题是,从这个框架中产生的任何弹出窗口(例如JDialogs)都会在框架后面打开,我只能通过alt-tabbing来访问它们。

此外,我正在运行两个显示器设置,每个显示器都被视为一个单独的显示器。如果在JFrame顶部打开任何窗口,并将鼠标光标移动到第二个监视器,则窗口将消失在JFrame后面。这是在RHEL 6.4上,所以可能是Linux窗口管理问题?还应该注意的是,我没有gnome-panel运行,所以它是一个完全裸的Linux桌面(没有菜单栏,没有任务栏)。

当我的JFrame被装饰时,事情表现正常。也就是说,当我将鼠标光标移动到第二个显示器时,弹出窗口打开,窗口不再消失。

只有当我将JFrame设置为未装饰的全屏时,Windows才会开始迷失它。就像Linux将未修饰的JFrame“锁定”到监视器上一样。我无法在这种状态下进行alt-drag。

如果我将JFrame设置为略小于显示器分辨率(例如小1像素),则不再“锁定”。我可以用它来拖动它,窗户不再迷失它。

有没有办法阻止Windows在全屏幕后丢失,未修饰的JFrame?

我已经尝试了此处列出的所有解决方案,但它们都不起作用: JFrame full screen focusing .

修改

在Java 7下运行时会出现上述问题。在Java 8下运行会修复对话框问题,但屏幕交叉问题仍然存在。

1 个答案:

答案 0 :(得分:0)

使用以下代码解决上述问题

public static void setfullscreen(final JFrame frm)
    {
        frm.dispose();
        /**`enter code here`
         * Set the Frame as Undecorated
         */
        frm.setUndecorated(true);
        /**
         * set the Frame's resize property as false
         */
        frm.setResizable(false);

        frm.requestFocus();
        /**
         * sets the frame as visible
         */
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                frm.setVisible(true);
            }

        }
        );

        Dimension screenSize = 
        Toolkit.getDefaultToolkit().getScreenSize();

        frm.setBounds(0,0,screenSize.width, screenSize.height);

    }

    /**
     * Close the Full Screen Mode 
     * @param frm
     */
    public static void closeFullScreen(final JFrame frm)
    {

        frm.dispose();

        frm.setUndecorated(false);
        /**
         * sets the frame as resize
         */
        frm.setResizable(true);
        /**
         * sets the frame as visible
         */

        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                frm.setVisible(true);
            }

        }
        );

    }

</i>