Java-Screen在将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

我试图在画布上绘制一些东西,将其添加到JFrame,然后将这个JFrame设置为全屏。我的问题是:在全屏模式下,我只看到一个黑屏。 在屏幕变黑之前,我很快就能看到画布的粉红色背景

直接在JFrame上绘图,然后将其设置为全屏,效果非常好,我可以看到测试文本。我认为正确显示画布有问题

这是我的密码:

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);

2) Swing GUI Related应该包装到
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);
    }