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);
阻止EDTThread.sleep(5000);
使用Swing Timer代替这里的演示 -
(如果没有真正重要的原因)不要将AWT与Swing混合其余就在这里 ,并使用
JPanel
而不是Canvas
(对于Canvas
是有paint
方法,对于JPanel
是paintComponent
) -
你的
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); }
我自己试了一下,工作得很好。