java中涉及背景图像的奇怪错误

java中涉及背景图像的奇怪错误,java,swing,background-image,Java,Swing,Background Image,我的问题是,当我运行我的程序时,我会得到一个白色的屏幕和来自早期构建的文本,而不是应该显示的背景图像。我已经删除了与该构建相关的所有代码 我四处寻找帮助,我看到的所有线程都说我是如何设置代码的。我甚至不明白显示的背景是从哪里来的 以下是救济品代码: package tactics; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import javax.swing.JFra

我的问题是,当我运行我的程序时,我会得到一个白色的屏幕和来自早期构建的文本,而不是应该显示的背景图像。我已经删除了与该构建相关的所有代码

我四处寻找帮助,我看到的所有线程都说我是如何设置代码的。我甚至不明白显示的背景是从哪里来的

以下是救济品代码:

package tactics;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.swing.JFrame;

public class Tactics2 extends JFrame{
    private Screen s;
    private BufferedImage bg;
    private BufferedImage template;
    private boolean loaded = false;

    public static void main(String[] args) throws IOException{ 

        DisplayMode dm = new DisplayMode(1024, 768, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
        Tactics2 t = new Tactics2();
        t.run(dm);
    }

    //run method
    public void run(DisplayMode dm) throws IOException{
        loadpics();

        s = new Screen(); 
        try{
            s.setFullScreen(dm, this);
            try{
                Thread.sleep(5000);
            }catch(InterruptedException ex){}
        }finally{
            s.restoreScreen();
        }
    }

    public void loadpics() throws IOException{
        bg = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
        template = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
        ChaosBack cb = new ChaosBack();
        bg = cb.ChaosBack(bg, template);
        loaded = true;
        repaint();
    }

    @Override
    public void paint(Graphics g){
        if(loaded){
            g.drawImage(bg, 0, 0, null);
        }
    }
}

你把油漆链弄断了

@Override
public void paint(Graphics g){
    if(loaded){
        g.drawImage(bg, 0, 0, null);
    }
}
基本上,您无法调用
super.paint
<代码>图形是一种共享资源,也就是说,为给定绘制周期绘制的所有内容都使用相同的
图形
上下文

绘制链的部分工作是通过清除
图形
上下文为绘制做好准备

您应该避免覆盖顶级容器的
绘制
,原因有很多。它不是双缓冲的,因此它在更新时可能会闪烁,并且它不考虑框架装饰,这意味着您最终可以在框架的边界下,而不是在可视区域内进行绘制

您最好创建一个自定义组件,从像
JPanel
这样的东西进行扩展,并覆盖它的
paintComponent
方法(确保调用
super.paintComponent

Thread.sleep(5000)Swing
应用程序中,code>是一个非常糟糕的主意。实际上,可以停止应用程序的冷启动,停止应用程序的更新/绘制或响应任何用户交互

Swing不是线程安全的。这意味着对UI的所有更改都必须在事件调度线程的上下文中进行

看看:


关于细节和想法

Thread.sleep(5000)不要阻止EDT(事件调度线程)-发生这种情况时,GUI将“冻结”。不要调用
Thread.sleep(n)
为重复任务执行Swing
计时器,或为长时间运行的任务执行
SwingWorker
。有关更多详细信息,请参阅。
g.drawImage(bg,0,0,null)
最好是
g.drawImage(bg,0,0,this)首先,我尝试添加super.paint(g)行,我认为这就是您所说的。我已经取消了覆盖,因为我只是添加了它,因为我得到了一个警告,告诉我添加一个。最后,重新绘制到for循环中是否可以消除线程?问题是,我没有看到您创建线程。使用javax.swing.Timer可能更好,但我们缺少做出真正决定的上下文