我有一个名为 calcResPanel
的 javax.swing.JPanel
(使用 java.awt.GridLayout
和 1
> 列和不定 (0
) 行),用于接收和显示一组 BHSelectableLabel
(扩展了 javax.swing.JTextField
)和 共同表示存储在名为 results
的 String
列表中的文本。我想我不妨给它以下行为:
- 第一次,只会添加新的
- 以下时间,它将:
- 将已添加的尽可能多的标签的文本更改为
结果
中尽可能多的值的文本 - 如果还有任何未更改的标签,请将其删除,因为它们不是必需的。否则,根据需要添加任意数量的新标签。
- 将已添加的尽可能多的标签的文本更改为
这对我来说很有意义。 如果这个算法不是我应该做的,那么现在停止阅读并用更好的算法发布答案。但是,如果您同意,请告诉我我的代码做错了什么:
int i, r, l;
for (i=0, r = results.length(), l = calcResPanel.getComponentCount(); i < r; i++)
if (i < l)
((BHSelectableLabel)calcResPanel.getComponent(i)).setText(results.get(i));
else
calcResPanel.add(new BHSelectableLabel(results.get(i)));
for (;i < l; i++)//If there are excess, unused lables, remove them
calcResPanel.remove(i);
此代码的问题在于它不一致地在 calcResPane
中留下多余的标签。如果您认为这个算法在概念上很好,那么请告诉我我的代码有什么问题导致它留下多余的标签?
回答
这也是一个简单的答案。我觉得自己很聪明^^;
int i, r, l;
for (i=0, r = results.length(), l = calcResPanel.getComponentCount(); i < r; i++)
if (i < l)
((BHSelectableLabel)calcResPanel.getComponent(i)).setText(results.get(i));
else
calcResPanel.add(new BHSelectableLabel(results.get(i)));
for (;i < l; i++)//If there are excess, unused lables, remove them
calcResPanel.remove(r);
最佳答案
for (;i < l; i++)//If there are excess, unused lables, remove them
calcResPanel.remove(i);
你永远不能像这样删除,因为你会跳过每第二个项目。假设您有 5 个项目,并且您尝试将它们全部删除:
第一次循环时 i = 0,因此删除了第 0 项,剩下了 1、2、3、4。
下一次循环 i = 1,因此您删除了第 2 项,剩下了 1、3、4。
我希望你能明白这个模式。
解决方案是从末尾删除项目,一次一个。
关于java - Java 中组件的重用没有正确修剪未重用的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7760831/