paintComponent()被调用200次

时间:2015-11-03 18:03:14

标签: java swing arraylist paintcomponent repaint

使用paintComponent()和repaint()时,我遇到了一个奇怪的问题。 如下所示,我有一个paintComponent()类作为内部类作为GUI的主要JPanel。

    // add another panel to centerInner
    tableBottom = new JPanel() {
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (!paintImages.isEmpty()) {
                for (PaintImages temp : paintImages) {
                    g.drawImage(temp.getImage(), temp.getX(), temp.getY(), this);
                }
            }
            if (!extraCards.isEmpty()) {
                for (PaintImages temp1 : extraCards) {
                    g.drawImage(temp1.getImage(), temp1.getX(), temp1.getY(), this);
                }
            }
        }
    };

这是一个黑色杰克游戏,有4名玩家经销商。

repaint()由4个函数调用:

初始绘制的构造函数。 一种更新方法,用于创建要为初始交易打印的ArrayList个对象。 另一种更新方法,为每张绘制的卡片创建ArrayList。 并重置清除所有ArrayLists并重新绘制新的初始交易。

我不会进入后端,但这四种方法中的每一种都只运行了所需的次数。每次被召唤一次。

我的问题是,当paintComponent调用repaint()时,paintComponent()会运行近200次,不包括平均每次运行10次的for个循环每场比赛。

我的问题是:

1)这是paintComponent方法的常见行为吗? paintComponent一遍又一遍地重复调用自己,直到完成所有必要的绘画?

OR

2)这与JPanel tableBottom有关吗?在这一点上,没有任何东西实际上被添加到JPanel,因为它是最顶级的JPanel。但是,对于每个JPanel,JFrame,ContentPane,Label等,可能会重复运行paintComponent

OR

3)我在下面的代码中做错了什么?再次通过使用增量和打印语句进行测试,我发现更新方法被称为适当的次数并正确地完成其工作。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

  

是一个内部类,我调用像tableBottom.paintComponent()

这样的重绘

永远不要直接调用paintComponent()方法。要重新绘制面板,请执行以下操作:

tableBottom.repaint();

请求将传递给RepaintManager,然后RepaintManager将对所有组件组合repaint()请求,然后根据需要绘制组件。这将使绘画更有效率。

g.drawImage(temp1.getImage(), temp1.getX(), temp1.getY(), this);

" this"意味着图像可以在阅读时重新绘制。有时,在图像I / O完成之前调用绘制方法。因此,在这种情况下,当I / O完成时,将进行另一个绘制请求,以便完全绘制图像。如果您在课程开始时阅读图像并将它们存储在某些数据结构中,那么您可以使用" null"而不是"这"。

  

我在下面的代码中做错了什么?

代码提供看起来合理,但我们无法查看调用绘制代码的方式/时间。我已经提到了一个问题。

发布展示问题的正确SSCCE