我有一个定制的 JCheckBoxTree,它的代码来自这个源。所以我想访问这棵树的每个 CheckBox 的状态。例如,我想通过按下按钮将树的一个项目设置为“选择”。我想我需要做一个循环来遍历DefaultMutableTreeNode
,如果节点文件等于指定的文件/字符串,则将其状态更改为SELECTED
. 但是,我不确定这是否是做这种事情的正确方法,也无法实现。
这是我尝试过的,(不起作用):
public void finder(DefaultMutableTreeNode root){
JTreeModification treeClass = new JTreeModification();
Enumeration en = root.depthFirstEnumeration();
//if(){}
while (en.hasMoreElements()) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) en.nextElement();
if(node.equals("file4.json")){
treeClass.new CheckBoxNode(new File(node.getParent(), node), JTreeModification.Status.SELECTED);
}
}
}
以下几行是我的主文件中的相关代码:
JTreeModification treeClass = new JTreeModification();
File myTest = new File("D:\\Documents\\A X");
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
final DefaultTreeModel treeModel = new DefaultTreeModel(root);
for (File fileSystemRoot: myTest.listFiles()) {
DefaultMutableTreeNode node = new DefaultMutableTreeNode(treeClass.new CheckBoxNode(fileSystemRoot, JTreeModification.Status.DESELECTED));
root.add(node);
}
treeModel.addTreeModelListener(treeClass.new CheckBoxStatusUpdateListener());
final JTree tree = new JTree(treeModel) {
@Override public void updateUI() {
setCellRenderer(null);
setCellEditor(null);
super.updateUI();
//???#1: JDK 1.6.0 bug??? Nimbus LnF
setCellRenderer(treeClass.new FileTreeCellRenderer());
setCellEditor(treeClass.new CheckBoxNodeEditor());
}
};
tree.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
tree.setRootVisible(false);
tree.addTreeSelectionListener(treeClass.new FolderSelectionListener());
tree.setEditable(true);
tree.expandRow(0);
panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
panel.add(new JScrollPane(tree), BorderLayout.CENTER);
这是我认为与我的问题有关的课程:
public enum Status { SELECTED, DESELECTED, INDETERMINATE }
class CheckBoxNode {
public final File file;
public Status status;
public CheckBoxNode(File file) {
this.file = file;
status = Status.INDETERMINATE;
}
public CheckBoxNode(File file, Status status) {
this.file = file;
this.status = status;
}
@Override public String toString() {
return file.getName();
}
}
在提供的 GitHub 链接中,有一个从第 72 行开始的方法,它的功能与我想要的类似,但我无法将它合并到我的方法中。
那么关于如何以编程方式更改树项目的状态有什么想法吗?
编辑:
public void finder(DefaultMutableTreeNode root){
JTreeModification treeClass = new JTreeModification();
Object o = root.getLastChild();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) o;
o = node.getUserObject();
CheckBoxNode check = (CheckBoxNode) o;
System.out.println(check);
if(check.toString().equals("Video1.avi")){
check.status = JTreeModification.Status.SELECTED;
//treeModel.addTreeModelListener(treeClass.new CheckBoxStatusUpdateListener());
}
System.out.println(check.status);
Enumeration e = node.children();
while (e.hasMoreElements()) {
finder(root);
}
}
我刚刚注意到上面的代码可以将“SELECTED”分配给迭代的第一个文件,如果它的名称与 if 语句中的名称相同。( Video1.avi
) 在这个例子中。所以我确信check.status = JTreeModification.Status.SELECTED;
可以完成这项工作。但是仍然存在两个问题,首先它不会在所有节点上循环。其次,虽然它分配Selected
给文件并且我可以在控制台打印中识别它,但它不会在 UI 中显示它,直到我检查或按下树中的另一个项目然后它更新 ui 和 set Video1.avi
。所以它需要遍历所有节点并更新 UI。