【发布时间】:2012-03-27 19:25:17
【问题描述】:
我正在尝试在 Canvas 上绘制一些东西,将其添加到 JFrame,然后将此 JFrame 设置为全屏。我的问题是:在全屏模式下我只看到黑屏。 在屏幕变黑之前,我很快就可以看到画布的粉红色背景。
直接在 JFrame 上绘图,然后将其设置为全屏效果非常好,我可以看到测试文本。我认为正确显示 Canvas 存在问题。
这是我的代码:
public class FullscreenTest extends Canvas {
private JFrame mainFrame;
public FullscreenTest(){
this.mainFrame = new JFrame();
JPanel contentPane = (JPanel) mainFrame.getContentPane();
contentPane.add(this);
}
public void run(DisplayMode dm){
setBackground(Color.PINK);
setForeground(Color.WHITE);
setFont(new Font("Arial", Font.PLAIN, 24));
Screen s = new Screen();
s.setFullScreen(dm, this.mainFrame);
try {
Thread.sleep(5000);
} catch (InterruptedException exc) { exc.printStackTrace(); }
s.closeFullScreenWindow();
}
public void paint(Graphics g){
g.drawString("This is some testtext", 200, 200);
}
public static void main(String[] args){
DisplayMode dm = new DisplayMode(800, 600, 32, DisplayMode.REFRESH_RATE_UNKNOWN);
FullscreenTest test = new FullscreenTest();
test.run(dm);
}
}
Screen.setFullScreen(DisplayMode dm, JFrame window) 方法的作用如下:
//graphicsDevice = GraphicsEnvironment.getLocalGraphicsEnvironment()
// .getDefaultScreenDevice();
public void setFullScreen(DisplayMode dm, JFrame window){
window.setUndecorated(true);
window.setResizable(false);
graphicsDevice.setFullScreenWindow(window);
if(dm != null && graphicsDevice.isDisplayChangeSupported()){
graphicsDevice.setDisplayMode(dm);
}
}
有人知道为什么我在全屏模式下看不到 JFrame 的内容吗?
【问题讨论】:
-
在调用 setFullScreen() 之后弹出 this.mainFrame.repaint() 调用有什么不同吗?我想知道更改为全屏是否会转储位,但它没有意识到需要重新绘制。
-
不幸的是,这并没有改变任何东西。当屏幕切换到全屏模式时,我很快就会在屏幕变黑之前看到画布的粉红色背景(即使没有 repaint())。
-
实际上,仔细想想,我认为问题在于使当前线程休眠 - 因为当前线程是 UI 线程,所以您实际上是在暂停 UI 线程,不允许它继续工作。尝试将 Thread.sleep() 从此类中取出并在调用 run() 后将其放入 main() - 然后添加一个单独的方法以再次缩小窗口。如果我的线程理论正确,那么睡眠是在应用程序线程上,而不是 UI 线程上。
-
我很快尝试了,但这似乎也不能解决问题。短暂显示粉红色背景后,全屏仍然变黑。
-
我找出了导致问题的原因:它是 DisplayMode 构造函数的位深度参数 (new DisplayMode(800, 600, 32, DisplayMode.REFRESH_RATE_UNKNOWN);) 虽然 32 位的位深度有效当我尝试将一个简单的 JFrame 设置为全屏时效果很好,似乎在全屏使用 32 位位深度的 Canvas 时出现问题。使用 16 位与我在问题中提供的源代码完美配合。不过,我真的不知道确切的问题是什么。
标签: java swing jframe awt fullscreen