如何在 java jtree 中动态地(从列表)添加节点到我的父节点?
How can I add dynamically (from a list) nodes to my parent nodes in java jtree?
我之前问过这个问题,但我觉得我没有给出太多的代码来解释我的问题。
这就是我想要做的:
我有一个名为 User
的对象列表。每个对象包含两个字段 - username
和 password
。我创建了一个方法来使用这样的用户名构建 jtree:
public class UserTreeBuilder implements TreeWillExpandListener {
private JTree userTree;
DefaultMutableTreeNode dummyParent;
public JTree build(List<User> list){
DefaultMutableTreeNode top = new DefaultMutableTreeNode("");
createNodes(top, list);
userTree = new JTree(top);
userTree.getSelectionModel().setSelectionMode
(TreeSelectionModel.SINGLE_TREE_SELECTION);
userTree.setRootVisible(false);
userTree.addTreeWillExpandListener(this);
return userTree;
}
public void createNodes(DefaultMutableTreeNode top, List<User> list) {
DefaultMutableTreeNode category = null;
DefaultMutableTreeNode user = null;
category = new DefaultMutableTreeNode("User");
top.add(category);
for(User ui : list){
user = new DefaultMutableTreeNode(ui.getUserName());
category.add(user);
}
}
@Override
public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) userTree.getLastSelectedPathComponent();
String nodeName = node.toString();
System.out.println("NODE TO STRING: "+nodeName);
if (node == null)
//Nothing is selected.
return;
}
@Override
public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
throw new UnsupportedOperationException("Not supported yet.");
}
效果很好,我看到的列表是:
(folder icon) users
(dot icon) user1
(dot icon) user2
(dot icon) user3
etc.
所以账户user1
、user2
等是最底层的节点。
我有一个方法可以获取用户名作为参数,returns 属于该用户的事物列表。它看起来像这样:
public ArrayList<Things> fetchThings(User user){
List<Things> list = new ArrayList<Things>();
.
.
.
return list;
我的问题是 - 当有人在我的原始 jtree 上单击给定用户然后将这些东西显示为分配给该用户的子节点时,我如何才能为特定用户获取东西(调用我的方法 fetchThings)?
例如,有人点击 user2
,他看到的是:
(folder icon) users
(folder icon) user1
(folder icon) user2
(dot icon) thing1
(dot icon) thing2
(dot icon) thing3
.
.
.
(folder icon) user3
etc.
我尝试从此页面使用延迟加载子项 https://docs.oracle.com/javase/tutorial/uiswing/components/tree.html,但无法正常工作。你能帮我实现吗?
如果你读过JTree
JavaDocs你会知道你可以通过使用像...
这样的东西来获得被点击的节点
MouseListener ml = new MouseAdapter() {
public void mousePressed(MouseEvent e) {
int selRow = tree.getRowForLocation(e.getX(), e.getY());
TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
if(selRow != -1) {
if(e.getClickCount() == 1) {
mySingleClick(selRow, selPath);
}
else if(e.getClickCount() == 2) {
myDoubleClick(selRow, selPath);
}
}
}
};
您可以使用 TreePath
到 getLastPathComponent
,这将 return 一个 Object
,在您的情况下,您可以将其转换为 DefaultMutableTreeNode
如果你读过TreeWillExpandListener
, TreeeExpansionEvent
and TreePath
的JavaDocs,你就会知道当treeWillExpand
被调用时,你可以通过TreeExpansionEvent#getPath#getLastPathComponent
获取将被展开的节点,类似...
@Override
public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) event.getPath().getLastPathComponent();
System.out.println(treeNode);
}
从那里你可以简单地调用你需要的任何功能,以获得你需要的信息来填充有问题的DefaultMutableTreeNode
你的user
DefaultMutableTreeNode
将需要覆盖isLeaf
方法和returnfalse
,这将允许节点"expandable", 类似...
for (User ui : list) {
user = new DefaultMutableTreeNode(ui.getUserName()) {
@Override
public boolean isLeaf() {
return false;
}
};
category.add(user);
}
我之前问过这个问题,但我觉得我没有给出太多的代码来解释我的问题。
这就是我想要做的:
我有一个名为 User
的对象列表。每个对象包含两个字段 - username
和 password
。我创建了一个方法来使用这样的用户名构建 jtree:
public class UserTreeBuilder implements TreeWillExpandListener {
private JTree userTree;
DefaultMutableTreeNode dummyParent;
public JTree build(List<User> list){
DefaultMutableTreeNode top = new DefaultMutableTreeNode("");
createNodes(top, list);
userTree = new JTree(top);
userTree.getSelectionModel().setSelectionMode
(TreeSelectionModel.SINGLE_TREE_SELECTION);
userTree.setRootVisible(false);
userTree.addTreeWillExpandListener(this);
return userTree;
}
public void createNodes(DefaultMutableTreeNode top, List<User> list) {
DefaultMutableTreeNode category = null;
DefaultMutableTreeNode user = null;
category = new DefaultMutableTreeNode("User");
top.add(category);
for(User ui : list){
user = new DefaultMutableTreeNode(ui.getUserName());
category.add(user);
}
}
@Override
public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) userTree.getLastSelectedPathComponent();
String nodeName = node.toString();
System.out.println("NODE TO STRING: "+nodeName);
if (node == null)
//Nothing is selected.
return;
}
@Override
public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
throw new UnsupportedOperationException("Not supported yet.");
}
效果很好,我看到的列表是:
(folder icon) users
(dot icon) user1
(dot icon) user2
(dot icon) user3
etc.
所以账户user1
、user2
等是最底层的节点。
我有一个方法可以获取用户名作为参数,returns 属于该用户的事物列表。它看起来像这样:
public ArrayList<Things> fetchThings(User user){
List<Things> list = new ArrayList<Things>();
.
.
.
return list;
我的问题是 - 当有人在我的原始 jtree 上单击给定用户然后将这些东西显示为分配给该用户的子节点时,我如何才能为特定用户获取东西(调用我的方法 fetchThings)?
例如,有人点击 user2
,他看到的是:
(folder icon) users
(folder icon) user1
(folder icon) user2
(dot icon) thing1
(dot icon) thing2
(dot icon) thing3
.
.
.
(folder icon) user3
etc.
我尝试从此页面使用延迟加载子项 https://docs.oracle.com/javase/tutorial/uiswing/components/tree.html,但无法正常工作。你能帮我实现吗?
如果你读过JTree
JavaDocs你会知道你可以通过使用像...
MouseListener ml = new MouseAdapter() {
public void mousePressed(MouseEvent e) {
int selRow = tree.getRowForLocation(e.getX(), e.getY());
TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
if(selRow != -1) {
if(e.getClickCount() == 1) {
mySingleClick(selRow, selPath);
}
else if(e.getClickCount() == 2) {
myDoubleClick(selRow, selPath);
}
}
}
};
您可以使用 TreePath
到 getLastPathComponent
,这将 return 一个 Object
,在您的情况下,您可以将其转换为 DefaultMutableTreeNode
如果你读过TreeWillExpandListener
, TreeeExpansionEvent
and TreePath
的JavaDocs,你就会知道当treeWillExpand
被调用时,你可以通过TreeExpansionEvent#getPath#getLastPathComponent
获取将被展开的节点,类似...
@Override
public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) event.getPath().getLastPathComponent();
System.out.println(treeNode);
}
从那里你可以简单地调用你需要的任何功能,以获得你需要的信息来填充有问题的DefaultMutableTreeNode
你的user
DefaultMutableTreeNode
将需要覆盖isLeaf
方法和returnfalse
,这将允许节点"expandable", 类似...
for (User ui : list) {
user = new DefaultMutableTreeNode(ui.getUserName()) {
@Override
public boolean isLeaf() {
return false;
}
};
category.add(user);
}