Как проверить "выбранный" элемент в JCheckBoxTree после нажатия кнопки
У меня есть настроенное 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
к файлу, и я мог бы распознать это в консоли печати, но он не показывает его в пользовательском интерфейсе, пока я не проверю или не нажму другой элемент в дереве, затем он обновит пользовательский интерфейс и установить Video1.avi
, Таким образом, он должен зациклить все узлы и обновить пользовательский интерфейс.