【发布时间】:2019-09-07 22:09:12
【问题描述】:
我一直在尝试开发一个游戏,我正处于让所有单独组件工作的初步阶段(因此我的代码很糟糕),在尝试渲染一个移动的正方形时,我遇到了一个问题。 paintComponent 方法会绘制正方形,但是当我使用计时器时,我无法让它工作。
我尝试移动计时器方法,在不同点使用重绘,并在某一点报废所有内容并从头开始重做。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.time.Clock;
import java.time.Duration;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
public class InputTest extends MyPanel implements KeyListener {
private static int x;
private static int y;
public static void main(String[] args) {
JFrame f = new JFrame();
InputTest p = new InputTest();
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setSize(500, 500);
p.setSize(500, 500);
f.add(p);
f.addKeyListener(new InputTest());
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
x++;
y++;
if (x > 500) {
x = 0;
}
if (y > 500) {
y = 0;
}
System.out.println("Tick"+x+","+y);
}
}, 0, 500);
p.setVisible(true);
f.setVisible(true);
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
public void update() {
}
@Override
protected void paintComponent(Graphics g) {
g.setColor(Color.BLACK);
while(x!=501&&y!=501) {
g.fillRect(x, y, 30, 30);
repaint();
}
}
}
方块应该从左上角缓慢移动到右下角。相反,我没有得到任何图像。
【问题讨论】:
-
在
paintComponent内部有一个无限循环不是一个好主意。它将阻塞整个线程,awt 应用程序需要这些线程才能工作。相反,您可以删除paintComponent中的循环并在计时器中调用repaint(),以便在更新坐标时重新绘制面板。