如何将 JFrame 从装饰状态切换为未装饰状态?

How do I switch a JFrame from being decorated to being not decorated?

我想让我正在制作的游戏全屏显示。我在 JPanel 中绘制游戏并将其添加到 JFrame。

我目前正在使用 graphicsDevice.setFullScreenWindow(jframe) 将 JFrame 设置为全屏。

JFrame 已装饰。当我设置为全屏时,还有 space 用于装饰,但我希望它占据整个屏幕。当我将 JFrame 设为未修饰时,全屏时它会占据整个屏幕。

我希望在窗口模式下装饰 JFrame,但在全屏模式下,我希望完全使用屏幕。

我试过将 JFrame 设置为不可见,然后更改装饰并将其设置回可见。我也试过将原件设置为有装饰,制作一个没有装饰的新 JFrame 并添加 JPanel 全屏。

我不确定,但我认为您无法在 JFrame 可见后更改 setUndecorated() 属性。因此,一种解决方案是拥有两个框架。一个窗口,一个全屏。当你想切换全屏时在帧之间切换。

由于您要在 JPanel 上绘制内容,解决方案是创建一个 draw() 方法来进行绘制。不过,如果您希望添加 Swing 组件,事情确实会变得有点复杂。总之,试试这个。

代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FullScreenExample {

    public static void main(String[] args) throws InterruptedException {
        new FullScreenExample();
    }

    public FullScreenExample() throws InterruptedException {
        // Full screen frame set-up.
        JFrame frameFullScr = new JFrame();
        frameFullScr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frameFullScr.setUndecorated(true);
        frameFullScr.add(new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                if(frameFullScr.isVisible()) draw(this, g);
            }
        });
        GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(frameFullScr);

        // Windowed frame set-up.
        JFrame frameWin = new JFrame();
        frameWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frameWin.setSize(512, 512);
        frameWin.add(new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                if(frameWin.isVisible()) draw(this, g);
            }
        });

        Thread.sleep(5000);

        // Now let's go into a window...
        frameFullScr.setVisible(false);
        frameWin.setVisible(true);
    }

    private void draw(JComponent component, Graphics g) {
        g.setColor(Color.ORANGE);
        g.fillRect(0, 0, component.getWidth(), component.getHeight());
        g.setColor(Color.RED);
        g.drawOval(32, 32, 256, 256);
    }

}

只是一些不相关的建议:如果您 运行 遇到性能问题,请尝试查看 AWT BufferStrategy。它更优化,更好地由显卡加速。您可以预期帧速率提高 +25% 到 75%。