我的问题是,当我运行我的程序时,我得到一个白色屏幕和早期版本的文本,而不是假设要显示的背景图像。我删除了与该版本相关的所有代码。
我已经四处寻求帮助,我看过的所有帖子都说写代码我是如何设置它的。我不明白显示的背景来自哪里。
以下是重温代码:
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);
}
}
}
答案 0 :(得分:4)
你打破了油漆链
@Override
public void paint(Graphics g){
if(loaded){
g.drawImage(bg, 0, 0, null);
}
}
基本上,你没有拨打super.paint
。 Graphics
是一个共享资源,也就是说,为给定绘制周期绘制的所有内容都使用相同的Graphics
上下文。
绘画链的部分工作是通过清除Graphics
背景来为绘画做准备。
出于多种原因,您应该避免覆盖顶级容器的paint
。它不是双缓冲的,所以它可能会随着它的更新而闪烁,并且它没有考虑到框架装饰,这意味着你最终可以在框架的边框下方绘制,而不是在可视区域内。
您最好创建一个自定义组件,从JPanel
扩展并覆盖它的paintComponent
方法(确保调用super.paintComponent
)
Thread.sleep(5000);
在Swing
应用程序中是一个非常糟糕的主意。可以实际停止您的应用程序冷却并停止更新/绘制或响应任何用户交互。
Swing不是线程安全的。这意味着必须在Event Dispatching Thread的上下文中对UI进行所有更改。
看看:
有关详细信息和想法