在java中重新绘制不起作用
我试图画一个每秒钟更新一次位置的矩形,因为我有一个扩展了JPanel的类,在这个类中我重写了paint(或paintComponent)函数uu我两个都试过了uu,但显然这个函数只被调用了一次,正如下面的代码所示,当我尝试在一个无限循环中使用repaint函数调用它时,它没有被调用,你知道我能做些什么吗在java中重新绘制不起作用,java,swing,repaint,Java,Swing,Repaint,我试图画一个每秒钟更新一次位置的矩形,因为我有一个扩展了JPanel的类,在这个类中我重写了paint(或paintComponent)函数uu我两个都试过了uu,但显然这个函数只被调用了一次,正如下面的代码所示,当我尝试在一个无限循环中使用repaint函数调用它时,它没有被调用,你知道我能做些什么吗 public class Board extends JPanel implements KeyListener{ public void setUpBoard(){ JFrame
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);
}
}
上面的代码是图形部分,下面是主函数,它位于另一个类中:
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是矩形位置被更新的地方,我已经检查过了,没有任何问题。问题是您正在
setUpBoard
中创建一个新的Board
对象,并将其添加到JFrame中:
Board board = new Board();
// ...
frame.add(board);
因此,当您使用repaint()
时,您正在重新绘制在main
方法中创建的Board
实例,而不是在setUpBoard
中创建的实例,该实例是您添加到框架中的实例
这可以通过使用Board=This轻松解决在setUpBoard
中使用code>,或者在我看来更简单的是,只需使用frame.add(this)
。随后对repaint
的调用将安排对paint
的调用,调用对象与您在main方法中创建的板对象相同
另外,由于您使用的是Swing,所以不要使用paint
,而是使用paintComponent
,确保super.paintComponent(g)
是方法体中的第一条语句。另一个问题是重绘调用是在主线程上进行的,而不是在事件线程上 您是否在调用之间更改任何内容以重新绘制?我会检查主菜单中的食物对象是否与绘制方法中的食物相同。不要覆盖paint
,使用paintComponent
;不要打断绘制链,确保正在调用super.paintComponent
;看一看,更好地理解绘画是如何工作的。此外,为了更好地理解Swing GUI的工作原理,您可能还想了解一下,为了简单起见,板
不应该创建框架,但它不会影响您的答案