出于某种原因,我的paintComponent(Graphics g)方法被无限调用。我似乎无法告诉谁在调用它,即使我在调用中转储了StackTrace(这是一个被调度和处理的事件)。
有没有简单的方法可以找出触发事件的人?
更新: 我找到了原因,现在我明白了原因。谁正确回答它将得到问题的答案。
以下是导致此问题的代码:
@Override
public void paintComponent(Graphics g)
{
myJButton.setIcon(ResourceLoader.getImageIconWithLocale(MY_BUTTON_IMAGE));
super.paintComponent(g);
}
仅供参考: 这是一个非常棘手的问题!通过查看代码并不明显。我做了一个错误的假设。
答案 0 :(得分:2)
我不知道这是哪个组件,但在绘图例程中在按钮上设置图标是个坏主意。它肯定会导致按钮被重新绘制。如果按钮是组件的子项,则设置按钮会使组件无效,从而导致无限循环。
将图标设置在其他位置,例如最初设置对话框/窗口的位置。
答案 1 :(得分:1)
如果ImageIcon是另一个实例,setIcon(ImageIcon)将重新验证并重新显示 ONLY 。
使用Locales时,大多数人都使用ResourceBundle,它返回Strings,而Strings又是不可变的。因此,反复设置文本无关紧要。
但是,在这种情况下,ResourceLoader(自定义类)返回了ImageIcon的新实例。当然它是相同的Image,但它是另一个例子。如果您反编译代码,您将看到setIcon(至少对于JButtons),如果newIcon!= oldIcon,它将重新绘制并重新验证。
解决方案是在ResourceLoader中使用HashMap,这样可以避免多次加载图像,因为大多数图像都经常使用(如果可以的话,可以重用实例)。事实证明,总体而言,这种快速调整也节省了相当多的总体内存消耗作为额外的奖励。
答案 2 :(得分:0)
你在任何地方打电话给repaint()
吗?此外,当窗口变得可见(未覆盖或最小化)或调整大小时,“系统”会自动调用屏幕上必须重绘的所有区域的paintComponent()
方法。
答案 3 :(得分:0)
问题是您在paintComponent()方法中设置图标。您永远不应该在此方法中设置属性。
Swing组件非常智能,可以在属性发生变化时自行重绘。在这种情况下,你会遇到组件重新绘制的问题,因为图标会发生变化,但每次组件重新绘制时,你也会重新读取图标,这也不是很有效。