java - Java 中组件的重用没有正确修剪未重用的组件

标签 java swing jcomponent removechild

我有一个名为 calcResPaneljavax.swing.JPanel (使用 java.awt.GridLayout1 > 列和不定 (0) 行),用于接收和显示一组 BHSelectableLabel(扩展了 javax.swing.JTextField)和 共同表示存储在名为 resultsString 列表中的文本。我想我不妨给它以下行为:

  1. 第一次,只会添加新的
  2. 以下时间,它将:
    1. 将已添加的尽可能多的标签的文本更改为结果中尽可能多的值的文本
    2. 如果还有任何未更改的标签,请将其删除,因为它们不是必需的。否则,根据需要添加任意数量的新标签。

这对我来说很有意义。 如果这个算法不是我应该做的,那么现在停止阅读并用更好的算法发布答案。但是,如果您同意,请告诉我我的代码做错了什么:

  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/

相关文章:

eclipse - 使用 Eclipse Window Builder 创建 SWING 应用程序

java - 使用什么 JComponent?

java - Java中是否有任何(无限制的)公平阻塞队列?

java - 如何避免在后台运行时启动应用程序时显示闪屏?

java - 如何使用Java API正确访问Hadoop 3.2.1?

java - 如何使 JButton 在 Java 中不可点击?

java - 如何在 java swing 中创建下载按钮/链接?

java - 在命令行中更改 Swing L&F 效果不佳

java - 如何在 JGraphX 中将组件背景设置为特定颜色?

添加到 JPanel 时,Java Swing 组件没有正确的大小