Java-Screen在将JFrame设置为全屏时变为黑色
我试图在画布上绘制一些东西,将其添加到JFrame,然后将这个JFrame设置为全屏。我的问题是:在全屏模式下,我只看到一个黑屏。 在屏幕变黑之前,我很快就能看到画布的粉红色背景 直接在JFrame上绘图,然后将其设置为全屏,效果非常好,我可以看到测试文本。我认为正确显示画布有问题 这是我的密码:Java-Screen在将JFrame设置为全屏时变为黑色,java,swing,jframe,awt,fullscreen,Java,Swing,Jframe,Awt,Fullscreen,我试图在画布上绘制一些东西,将其添加到JFrame,然后将这个JFrame设置为全屏。我的问题是:在全屏模式下,我只看到一个黑屏。 在屏幕变黑之前,我很快就能看到画布的粉红色背景 直接在JFrame上绘图,然后将其设置为全屏,效果非常好,我可以看到测试文本。我认为正确显示画布有问题 这是我的密码: public class FullscreenTest extends Canvas { private JFrame mainFrame; public FullscreenTe
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的内容吗?1)您有三个常见问题
- 切勿使用
Thread.sleep(5000)阻塞EDT代码>使用,而不是演示
- (如果没有真正重要的原因)不要混合其他原因,使用
而不是JPanel
(对于Canvas
是否有Canvas
方法,对于paint
是否有JPanel
)paintComponent
- 您的
是到public void paint(Graphics g){
而不是JFrame
,并由Canvas
Thread.sleep(5000);
invokeLater()
中
public static void main(String[] args){
更多关于
3) 您可以找到如何在Swing中使用背景线程的演示我同意mKorbel(事实上,我有您的代码,他建议进行更正)。只有一个提示可以进一步实现更可预测的结果:控制
paint()中的颜色
方法。不同系统的默认背景颜色可能不同。在我的系统上,它在浅红色背景上绘制白色文本。但如果它在黑色背景上绘制黑色文本,测试将看起来“不工作”。嘿,我遇到了同样的问题,每次运行程序时屏幕都会变黑。
在绘画方法的一部分,你写道,我认为它来自Bucky教程,顺便说一句,这很神奇:
public void paint(Graphics g){
g.drawString("This is some testtext", 200, 200);
}
你所要做的就是使用“超级”
我自己也试过,效果很好。在调用setFullScreen()之后,是否会弹出this.mainFrame.repaint()调用有什么不同吗?我想知道更改为全屏是否会转储位,但它没有意识到需要重新绘制。不幸的是,这没有改变任何东西。当屏幕转到全屏模式时,我很快看到画布的粉红色背景,然后屏幕变黑(即使没有重新绘制().实际上,仔细想想,我认为问题在于使当前线程处于睡眠状态-因为当前线程是UI线程,所以您实际上暂停了UI线程,不允许它继续工作。尝试将thread.sleep()从此类中取出,并在调用run()后将其放入main()中-然后添加一个单独的方法再次缩小窗口。这样,如果我的线程理论正确的话,睡眠在应用程序线程上,而不是UI线程上。我很快尝试了一下,但这似乎也不能解决问题。在显示粉色背景后不久,整个屏幕仍然变黑。我找到了原因解决问题:这是DisplayMode构造函数的位深度参数(新的DisplayMode(800、600、32、DisplayMode.REFRESH\u RATE\u UNKNOWN);)虽然当我尝试将简单的JFrame设置为全屏时,32位的位深度效果很好,但在32位深度的全屏中使用画布时,似乎出现了问题。使用16位与我在问题中提供的源代码配合得非常好。但我真的不知道确切的问题是什么。仅供参考,这里有一个相关的例子,super正在使用super类中的所有方法并应用它。
public void paint(Graphics g){
super.paint(g);
g.drawString("This is some testtext", 200, 200);
}