java - PaintComponent() 被调用 200 次

标签 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);
                }
            }
        }
    };

这是一款黑 jack 游戏,有 4 名玩家和庄家。

repaint() 由 4 个函数调用:

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

我不会进入后端,但这四种方法中的每一种都只运行所需的次数。每次调用时只需一次。

我的问题是,当 repaint() 调用 paintComponent 时,paintComponent() 运行了近 200 次,不包括 >for 循环每场游戏平均运行 10 次左右。

我的问题是:

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

或者

2) 这与 JPanel tableBottom 有关吗?此时,实际上没有任何内容被添加到 JPanel,因为它是最顶层的 JPanel。但也许 paintComponent 会针对每个 JPanel、JFrame、ContentPane、Label 等重复运行,

或者

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

感谢您的帮助。

最佳答案

being a inner class I call repaint like tableBottom.paintComponent()

切勿直接调用paintComponent()方法。要重新绘制面板,您需要执行以下操作:

tableBottom.repaint();

请求将被传递到 RepaintManager,然后 RepaintManager 将组合所有组件的 repaint() 请求,然后根据需要绘制组件。这将使绘画更加高效。

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

“this”意味着图像可以在读取时重新绘制。有时,绘制方法会在图像 I/O 完成之前被调用。因此,在这种情况下,当 I/O 完成时,将发出另一个绘制请求,以便完整绘制图像。如果您在类(class)开始时读取图像并将它们存储在某种数据结构中,那么您可能可以只使用“null”而不是“this”。

Did I do something wrong in my code below?

提供的代码看起来很合理,但我们看不到如何/何时调用绘画代码的上下文。我已经提到过一个问题。

发布正确的SSCCE这说明了问题。

关于java - PaintComponent() 被调用 200 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33506094/

相关文章:

java - 自定义 ListView 文本颜色未更改

java - JTableCombo 值在运行时未更改

android - 在 Android 中为 ArrayList 设置自定义适配器

java - 检查字符串是否在字符串的 ArrayList 中

java - Spring 不会在运行时发现新上下文的 @RequestMapping 注释

java - 从 Main 方法调用 Main 方法

java - 将底部的线性布局固定为 android 中的页脚

java - JButton 按键 - 没有任何反应

java - 为什么在Java中必须使用paintComponent方法来绘制?

java - 如何通过键列表对 Hashmap 中的列表元素进行分组