如何将 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%。
我想让我正在制作的游戏全屏显示。我在 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%。