代码之家  ›  专栏  ›  技术社区  ›  Stephane Grenier

谁在呼叫paintComponent?

  •  3
  • Stephane Grenier  · 技术社区  · 15 年前

    出于某种原因,我的paintComponent(Graphics g)方法被无限调用。我似乎不知道是谁在调用它,即使我在调用中转储了StackTrace(这是一个被调度和处理的事件)。

    有什么简单的方法可以找出是谁触发了这一事件吗?

    更新: 我找到了原因,现在我明白了原因。谁答对了就得到问题的答案。

    @Override
    public void paintComponent(Graphics g)
    {
        myJButton.setIcon(ResourceLoader.getImageIconWithLocale(MY_BUTTON_IMAGE));
        super.paintComponent(g);
    }
    

    这真是个棘手的问题!!看代码就不明显了。我做了一个错误的假设。

    4 回复  |  直到 15 年前
        1
  •  2
  •   locka    15 年前

    我不知道这是哪个组件,但是在绘制例程中设置按钮图标是个坏主意。它肯定会导致按钮被重新油漆。如果按钮是组件的子级,那么设置按钮也会使组件无效,从而导致无限循环。

    在其他地方设置图标,例如对话框/窗口的初始设置位置。

        2
  •  1
  •   Stephane Grenier    15 年前

    如果ImageIcon是另一个实例。

    但是,在本例中,ResourceLoader(自定义类)返回了ImageIcon的新实例。当然是同一个图像,但这是另一个实例。如果你反编译代码,你会看到setIcon(至少对于JButtons),如果newIcon!=旧图标。

    解决方案是在ResourceLoader中使用HashMap,这样可以避免多次加载图像,因为大多数图像使用非常频繁(如果可以的话,还可以重用实例)。结果表明,总的来说,这种快速调整还节省了相当多的内存消耗作为额外的奖励。

        3
  •  0
  •   Amir Afghani    15 年前

    repaint() 任何地方?此外,当窗口变为可见(未覆盖或未最小化)或调整大小时,“系统”会自动调用 paintComponent()

        4
  •  0
  •   camickr    15 年前

    问题是您正在paintComponent()方法中设置图标。您不应该在此方法中设置属性。

    Swing组件足够聪明,可以在属性更改时重新绘制自己。在这种情况下,您会遇到组件重新绘制自身的问题,因为图标会发生变化,但是每次组件重新绘制自身时,您都会重新读取图标,这也不是很有效。