当前位置: 首页 > 知识库问答 >
问题:

在java中重新绘制不起作用

丌官向荣
2023-03-14

我试图绘制一个矩形,它的位置每秒钟更新一次,因为我有一个类,它扩展了JPanel,在它里面我重写了油漆(或油漆组件)function_我已经尝试了这两个_但显然这个函数只被调用一次,正如下面的代码所示,当我试图用reaint函数在无限循环中调用它时,它没有被调用,我能做什么?

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();
        }
    }


}

在上面的代码中,食物。加法器是矩形位置更新的地方,我已经检查过了,没有任何问题。

共有2个答案

穆歌者
2023-03-14

另一个问题是重绘调用是在主线程上完成的,而不是在事件线程上。

安明亮
2023-03-14

问题是您正在setUpBoard中创建一个新的Board对象,并将其添加到您的JFrame中:

Board board = new Board();
// ...
frame.add(board);

因此,当您使用repaint()时,您正在重新绘制在main方法中创建的Board实例,而不是在setUpBoard中创建的实例,后者是您添加到框架中的实例。

这可以通过使用Board=This轻松解决 setUpBoard中使用code>,或者,在我看来更简单的是,只需使用框架。添加(此)。随后对repaint的调用将为在main方法中创建的同一个板对象安排对paint的调用。

另外,由于您使用的是Swing,所以不要使用paint,而是使用paintComponent,确保super。paintComponent(g)是方法体中的第一条语句。

 类似资料:
  • 我有一个正在添加JLabel的JPanel。然后我想删除所有的JLabel并添加一些新的。 所以我做了以下几点: 这很好。当我在这之后开始一个新线程时,我的问题就出现了,比如: 然后原始JLabels的输出仍然可见。我读到重新验证过程是一个长时间运行的任务,因此firstProducer线程正在启动,而重新验证正在进行并产生冲突。处理这个问题的最佳方法是什么?

  • 所以我开始学习OOP,也开始学习swing库,但我遇到了麻烦。当我试图删除所有JFrame组件时,它不起作用。我想做的是,当用户单击一个按钮时,我必须删除所有JFrame组件并添加新组件,但它不起作用,尽管我使用了removeAll()repait()、revalidate()等。下面是我的BankApp类代码: 这里是BankGUI: 下面是我的ButtonListener课程: 当我尝试这样做

  • 我想重新绘制我的屏幕。到目前为止,它所做的只是在第一个屏幕上的头部应该在的地方显示一个点。这很好,但是我在代码中写了我想每秒将头部向下移动10个像素。我正在打印头部应该在的位置,在命令提示符中它显示y值确实在增加。但是在我的屏幕上,头部没有移动。 我尝试过使用revalidate方法,尝试扩展canvas类而不是jframe,我尝试过只为paint方法使用不同的类,我尝试过用paintCompon

  • 在航站楼如何做到这一点?

  • 问题内容: 我已经建立了俄罗斯方块游戏。现在,我已经使用JPanel来显示内容和块(使用paintComponents()方法)。 问题是,当我尝试从另一个JFrame调用tetris程序时,它根本无法绘制。 我的俄罗斯方块主菜单的代码是: 当调用MatrixBoard的构造函数时,俄罗斯方块游戏会在新窗口中开始。但是,这些块在屏幕上不可见。MatrixBoard的代码是: 请帮忙。我怀疑问题出在

  • 我正在遵循我上一篇关于绘画的帖子中的建议,即Oracle Swing教程。现在我对何时以及如何调用paintComponent()方法感到困惑。 下面是课程: 教程说,两种重绘方法都是重绘以前的鼠标位置以及新的鼠标位置。我明白,但是paintComponent从何而来?当我们说重绘时,它被调用了吗?如果是这样,为什么不在前面的位置也画一个矩形呢?