我正在尝试绘制一个矩形,其位置每秒更新一次,因为我有一个扩展JPanel的类,在其中我覆盖了paint(或paintComponent)函数_我已经尝试了两个_但是这个函数是apparanetly只调用一次并且因为它在下面的代码中显示当我尝试在具有重绘函数的无限循环中调用它时它不被调用,任何想法我能做什么?
public class Board extends JPanel implements KeyListener{
public void setUpBoard(){
JFrame frame = new JFrame();
Board board = new Board();
frame.setVisible(true);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 600);
frame.setLocation(350, 80);
frame.add(board);
}
public void paint(Graphics g){
g.setColor(Color.RED);
g.fillRect(food.getX(),200,20,20);
}
}
上面的代码是图形部分,下面是main函数,它放在另一个类中:
public static void main(String[] args) throws InterruptedException {
Board board = new Board();
FoodGenerator food = new FoodGenerator();
board.setUpBoard();
while(true){
board.repaint();
food.adder();
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在上面的代码中,food.adder是矩形位置的更新位置,我已经检查过,并没有任何问题。
答案 0 :(得分:2)
问题是您在Board
中创建了一个新的setUpBoard
对象,并将 添加到您的JFrame中:
Board board = new Board();
// ...
frame.add(board);
因此,当您使用repaint()
时,您重新绘制了在Board
方法中创建的main
实例,而不是您在setUpBoard
中创建的实例,这是你添加到框架中的那个。
使用Board board = this;
中的setUpBoard
可以很容易地解决这个问题,或者在我看来更简单,只需使用frame.add(this)
即可。然后,对repaint
的后续调用将为您在主方法中创建的同一Board对象安排对paint
的调用。
此外,由于您使用的是Swing,请不要使用paint
,而是使用paintComponent
,确保super.paintComponent(g)
是方法体中的第一个语句。< / p>
答案 1 :(得分:0)
另一个问题是重绘调用是在主线程上完成的,而不是在事件线程上完成的。