Java – 将JFrame设置为全屏时,屏幕变为黑色

我正在尝试在Canvas上绘制内容,将其添加到JFrame,然后将此JFrame设置为Fullscreen。 我的问题是:在全屏模式下我只看到黑屏。 在屏幕变黑之前,我很快就会看到canvas的粉红色背景。

直接在JFrame上绘图,然后将其设置为全屏工作完全正常,我可以看到testtext。 我认为正确显示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窗口)方法的作用:

 //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的内容?

1)你有三个一般性问题

  • 永远不要使用Thread.sleep(5000);阻止EDT Thread.sleep(5000); 使用Swing Timer代替这里的演示

  • (如果没有真正重要的原因)不要将AWT与Swing混合其余就在这里 ,并使用JPanel而不是Canvas (对于Canvas是有paint方法,对于JPanelpaintComponent

  • 你的public void paint(Graphics g){JFrame而不是Canvas并被Thread.sleep(5000);锁定Thread.sleep(5000);

2)Swing GUI rellated应该包含在invokeLater()

 public static void main(String[] args){ 

更多在初始线程中

3) 在链接代码示例中,您可以找到如何在Swing中使用后台线程的演示

我同意mKorbel(实际上,我的代码正在处理他建议的更正)。 只需提示一下即可获得更可预测的结果:在paint()方法中控制颜色。 背景的默认颜色可能因系统而异。 在我的系统上,它在浅红色背景上绘制白色文本。 但如果它在黑色背景上绘制黑色文本,测试将看起来像“不工作”。

嘿,我有同样的问题,每次运行程序时屏幕变黑。 在paint方法的一部分中,你写了,我认为它来自Bucky教程,顺便说一句:

 public void paint(Graphics g){ g.drawString("This is some testtext", 200, 200); } 

你所要做的就是用“超级”

 public void paint(Graphics g){ super.paint(g); g.drawString("This is some testtext", 200, 200); } 

我自己试了一下,工作得很好。