Проблема Java с выбором дерева - PullRequest
0 голосов
/ 18 ноября 2009

В моей программе у меня есть 2 JTrees, и для обоих есть общий слушатель выбора дерева. Проблема возникает, когда я выбираю узел в первом дереве, а затем сразу же выбираю узел во втором дереве. Теперь, если я вернусь и выберу тот же узел в первом дереве, которое было изначально выбрано, ничего не произойдет. Как мне это решить? Есть ли способ отменить выбор узла в конце обработчика события valueChanged?

После редактирования:

Теперь, если я только сделаю

     if ( tree == tree1 ){

        if(!tree2.isSelectionEmpty()){

            tree2.clearSelection();

        }

    } else {

        if(!tree1.isSelectionEmpty()){

            tree1.clearSelection();
        }

    }

При первом выборе дерева все работает нормально. Но во второй раз, если я выбираю из другого дерева, слушатель дважды увольняется, и мне приходится дважды щелкать, чтобы выбрать его. Любая подсказка, почему?

1 Ответ

1 голос
/ 18 ноября 2009

Swing не очистит выбор JTree (или JTable, JList и т. Д.), Когда он потеряет фокус. Вы должны определить эту логику самостоятельно. Следовательно, в вашем примере возврат назад и выбор узла в первом дереве не имеет никакого эффекта, поскольку он уже выбран.

Вот пример реализации TreeSelectionListener, которая очищает выбор одного JTree при выборе другого.

public static class SelectionMaintainer implements TreeSelectionListener {
  private final JTree tree1;
  private final JTree tree2;

  private boolean changing;

  public SelectionMaintainer(JTree tree1, JTree tree2) {
    this.tree1 = tree1;
    this.tree2 = tree2;
  }

  public valueChanged(TreeSelectionEvent e) {
    // Use boolean flag to guard against infinite loop caused by performing
    // a selection change in this method (resulting in another selection
    // event being fired).
    if (!changing) {
      changing = true;
      try {
        if (e.getSource == tree1) {
          tree2.clearSelection();
        } else {
          tree1.clearSelection();
        }
      } finally {
        changing = false;
      }
    }   
  }
}
...