这就是我的代码的工作方式
class Main extends JFrame implements Runnable {
public Main() {
//init everything
}
public void start() {
running = true;
Thread thread = new Thread(this);
thread.start();
}
public void run() {
while(running) {
render();
}
}
public void render() {
Image dbImage = createImage(width, height);
Graphics dbg = dbImage.getGraphics();
draw(dbg);
Graphics g = getGraphics();
g.drawImage(dbImage, 0, 0, this);
g.dispose();
}
public void draw(Graphics g) {
for(int y=0; y < map.length; y++) {
for(int x=0; x < map.length; x++) {
g.drawImage(map.map[x + y* map.MAP_DIM], x*MAP_DIM, y*MAP_DIM, this);
}
}
}
public static void main(String... args) {
Main main = new Main();
main.start();
}
}
但是没有画出来,我看到的都是灰色的。有人知道是什么问题吗?我试着在draw()方法的末尾做repaint(),但仍然没有。
您不应该在Java中使用Swing自己管理绘图。
必须让EDT线程通过自己的线程调用适当的重绘方法。这是通过调用JComponent
的paint(Graphics g)
来完成的。现在你不应该重写这个方法,而应该重写paintComponent(Graphics g)
。
所以你应该把你的绘制方法从线程移到合适的绘制方法:
public void run() {
while (running)
repaint();
}
public void paintComponent(Graphics g) {
draw(g);
}
请注意,您应该以固定的帧率调用重绘,并使用双重缓冲以避免闪烁。
一个更简单的解决方案是嵌入一些已经为这种工作准备好的东西,比如处理框架,它工作得很好。