树选择的Java问题

时间:2009-11-18 08:44:27

标签: java swing jtree

在我的程序中,我有2个JTree,并且两者都有一个共同的treeselection监听器。当我在第一个树中选择一个节点然后立即在第二个树中选择一个节点时,会出现问题。现在,如果我要返回并在最初选择的第一个树中选择相同的节点,则不会发生任何事情。我该如何解决这个问题?有没有办法在valueChanged事件处理程序的末尾取消选择节点?

编辑后:

现在,如果我只做

     if ( tree == tree1 ){

        if(!tree2.isSelectionEmpty()){

            tree2.clearSelection();

        }

    } else {

        if(!tree1.isSelectionEmpty()){

            tree1.clearSelection();
        }

    }

我第一次选择树时效果很好。但第二次,如果我从另一个树中选择,听众会被解雇两次,我必须双击才能选择它。有什么线索的原因?

1 个答案:

答案 0 :(得分:1)

当失去焦点时,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;
      }
    }   
  }
}