Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中重新绘制不起作用_Java_Swing_Repaint - Fatal编程技术网

在java中重新绘制不起作用

在java中重新绘制不起作用,java,swing,repaint,Java,Swing,Repaint,我试图画一个每秒钟更新一次位置的矩形,因为我有一个扩展了JPanel的类,在这个类中我重写了paint(或paintComponent)函数uu我两个都试过了uu,但显然这个函数只被调用了一次,正如下面的代码所示,当我尝试在一个无限循环中使用repaint函数调用它时,它没有被调用,你知道我能做些什么吗 public class Board extends JPanel implements KeyListener{ public void setUpBoard(){ JFrame

我试图画一个每秒钟更新一次位置的矩形,因为我有一个扩展了JPanel的类,在这个类中我重写了paint(或paintComponent)函数uu我两个都试过了uu,但显然这个函数只被调用了一次,正如下面的代码所示,当我尝试在一个无限循环中使用repaint函数调用它时,它没有被调用,你知道我能做些什么吗

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的工作原理,您可能还想了解一下,为了简单起见,
不应该创建框架,但它不会影响您的答案