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); } }
像这样放在JScrollPane里面的的两棵树,树型结构是完全一样的,
如果要想做到选中一棵树上节点是,同时另一棵树自动跳转选中与当前选中节点相对应的节点,
展开一棵树的子节点时,同时另一棵树自动也展开对应的节点。
应该怎么做啊?请各位达人指教~
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);
}
}
我的两棵树虽然结构完全相同,但是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);
}
}
int row = leftTree.getRowForPath(mousePath);
if(row != -1)
{
rightTree.setSelectionPath(rightTree.getPathForRow(row));
}似乎我的树用leftTree上得到的TreePath去选中rightTree上的节点或者展开、关闭右边的节点都不起作用,
我的两棵树虽然是自己写的类,继承自JTree,但是结构都一样,节点名称也都一样,
为什么不行这样?我都快郁闷死了。
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();
}
}
}