为什么在同一个Panel里面并排放两个JTree组件,其中一个Tree组件不能获得焦点?多谢多谢!

解决方案 »

  1.   

    哎呀,我真是笨!我把setEditable写成setEnable了,还在那儿着急了半天~不过我还有另一个问题,
    像这样放在JScrollPane里面的的两棵树,树型结构是完全一样的,
    如果要想做到选中一棵树上节点是,同时另一棵树自动跳转选中与当前选中节点相对应的节点,
    展开一棵树的子节点时,同时另一棵树自动也展开对应的节点。
    应该怎么做啊?请各位达人指教~
      

  2.   

    import java.awt.GridLayout;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.event.TreeExpansionEvent;
    import javax.swing.event.TreeExpansionListener;public class T
    {
    public static void main(String[] args)
    {
    final JTree tree1 = new JTree();
    final JTree tree2 = new JTree(tree1.getModel());
    tree2.setSelectionModel(tree1.getSelectionModel());

    tree1.addTreeExpansionListener(new TreeExpansionListener() {
    public void treeExpanded(TreeExpansionEvent event)
    {
    tree2.expandPath(event.getPath());
    } public void treeCollapsed(TreeExpansionEvent event)
    {
    tree2.collapsePath(event.getPath());
    }
    }); tree2.addTreeExpansionListener(new TreeExpansionListener() {
    public void treeExpanded(TreeExpansionEvent event)
    {
    tree1.expandPath(event.getPath());
    } public void treeCollapsed(TreeExpansionEvent event)
    {
    tree1.collapsePath(event.getPath());
    }
    });

    JScrollPane sp1 = new JScrollPane(tree1);
    JScrollPane sp2 = new JScrollPane(tree2); JFrame frame = new JFrame();
    frame.getContentPane().setLayout(new GridLayout());
    frame.getContentPane().add(sp1);
    frame.getContentPane().add(sp2);
    frame.setSize(600, 600);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    }
      

  3.   

    gtlang78(),偶像啊!还有啊,你这个树可以实现,可是我把你的代码用到我的树上就不行。
    我的两棵树虽然结构完全相同,但是tree2.expandPath(event.getPath());这句不起作用。
    我只能用下面的代码才能起作用,为什么会这样?public void treeExpanded(TreeExpansionEvent event)
    {
        int row = leftTree.getRowForPath(evt.getPath());
        System.out.println("leftTreeExpansionListener: " + row);
        if(row != -1)
        {
            rightTree.expandRow(row);
        }
    }
      

  4.   

    其实我的两棵树,联动选中树节点也是通过计算row来实现的。TreePath mousePath = leftTree.getPathForLocation(e.getX(), e.getY());
    int row = leftTree.getRowForPath(mousePath);
    if(row != -1)
    {
        rightTree.setSelectionPath(rightTree.getPathForRow(row));
    }似乎我的树用leftTree上得到的TreePath去选中rightTree上的节点或者展开、关闭右边的节点都不起作用,
    我的两棵树虽然是自己写的类,继承自JTree,但是结构都一样,节点名称也都一样,
    为什么不行这样?我都快郁闷死了。
      

  5.   

    你是不是用了 DefaultMutableTreeNode? 这个类没有equals()方法, 所以不同的tree的相同结构的 TreePath也被认为是不同的,自己写一个 DefaultMutableTreeNode的子类吧,实现equals()和hashCode()方法import java.awt.GridLayout;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.event.TreeExpansionEvent;
    import javax.swing.event.TreeExpansionListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreeModel;public class T {
    public static void main(String[] args) {
    final JTree tree1 = new JTree(getDefaultTreeModel());
    final JTree tree2 = new JTree(getDefaultTreeModel());
    tree2.setSelectionModel(tree1.getSelectionModel()); tree1.addTreeExpansionListener(new TreeExpansionListener() {
    public void treeExpanded(TreeExpansionEvent event) {
    tree2.expandPath(event.getPath());
    } public void treeCollapsed(TreeExpansionEvent event) {
    tree2.collapsePath(event.getPath());
    }
    }); tree2.addTreeExpansionListener(new TreeExpansionListener() {
    public void treeExpanded(TreeExpansionEvent event) {
    tree1.expandPath(event.getPath());
    } public void treeCollapsed(TreeExpansionEvent event) {
    tree1.collapsePath(event.getPath());
    }
    }); JScrollPane sp1 = new JScrollPane(tree1);
    JScrollPane sp2 = new JScrollPane(tree2); JFrame frame = new JFrame();
    frame.getContentPane().setLayout(new GridLayout());
    frame.getContentPane().add(sp1);
    frame.getContentPane().add(sp2);
    frame.setSize(600, 600);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }

    protected static TreeModel getDefaultTreeModel() {
    DefaultMutableTreeNode      root = new MyTreeNode("JTree");
    DefaultMutableTreeNode      parent;

    parent = new MyTreeNode("colors");
    root.add(parent);
    parent.add(new MyTreeNode("blue"));
    parent.add(new MyTreeNode("violet"));
    parent.add(new MyTreeNode("red"));
    parent.add(new MyTreeNode("yellow"));

    parent = new MyTreeNode("sports");
    root.add(parent);
    parent.add(new MyTreeNode("basketball"));
    parent.add(new MyTreeNode("soccer"));
    parent.add(new MyTreeNode("football"));
    parent.add(new MyTreeNode("hockey"));

    parent = new MyTreeNode("food");
    root.add(parent);
    parent.add(new MyTreeNode("hot dogs"));
    parent.add(new MyTreeNode("pizza"));
    parent.add(new MyTreeNode("ravioli"));
    parent.add(new MyTreeNode("bananas")); return new DefaultTreeModel(root);
        } private static class MyTreeNode extends DefaultMutableTreeNode {
    public MyTreeNode(Object userObj) {
    super(userObj);
    }

    public boolean equals(Object obj) {
    if (obj instanceof MyTreeNode) {
    MyTreeNode node = (MyTreeNode) obj;
    return userObject == null ? node.userObject == null : userObject.equals(node.userObject);
    }
    return false;
    }

    public int hashCode() {
    return userObject == null ? 0 : userObject.hashCode();
    }
    }
    }
      

  6.   

    真是滔滔江水!非常感谢 gtlang78() 的指教!本来还有问题像请教,但这个帖子分数不多,还是另开帖子来向您请教吧~