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可能更好,但我们缺少做出真正决定的上下文