Повторное использование компонентов в Java не правильно обрезает неиспользованные - PullRequest
2 голосов
/ 14 октября 2011

У меня есть javax.swing.JPanel, называемый calcResPanel (использующий java.awt.GridLayout со столбцом 1 и неопределенными (0) строками), который должен принимать и отображать набор BHSelectableLabel с (которые расширяются javax.swing.JTextField) вместе представляют текст, хранящийся в списке String с именем results.Я подумал, что мог бы также дать ему следующее поведение:

  1. В первый раз, он будет добавлять только новые
  2. В следующий раз, он будет:
    1. Измените текст как можно большего количества уже добавленных меток, чтобы он соответствовал как можно большему числу значений в results, насколько это возможно
    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);

1 Ответ

4 голосов
/ 14 октября 2011
for (;i < l; i++)//If there are excess, unused lables, remove them     
    calcResPanel.remove(i); 

Вы никогда не сможете сделать такое удаление, потому что пропускаете каждый второй элемент. Допустим, у вас есть 5 элементов, и вы пытаетесь удалить их все:

Первый раз в цикле i = 0, поэтому вы удаляете элемент 0 и у вас остаются 1, 2, 3, 4.

В следующий раз через цикл я = 1, поэтому вы удаляете элемент 2 и у вас остаются 1, 3, 4.

Я надеюсь, что вы получили образец.

Решением является удаление элементов с конца, по одному за раз.

...