如何将JFrame从装饰切换到未装饰?

时间:2016-07-24 04:57:52

标签: java jframe fullscreen

我想要一个全屏制作的游戏。我将游戏绘制在JPanel中并添加到JFrame中。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

由于您要将内容绘制到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%。

相关问题