Я использую JTree
, который использует DefaultTreeModel
. Эта модель дерева имеет несколько узлов внутри, и когда я нажимаю на узел, я получаю информацию об узле и меняю цвет фона, чтобы показать, что этот узел выбран.
Можно ли вызвать дерево, чтобы очистить выделение, когда я нажимаю на любое место вне дерева? Очистив выделение, я смогу снова изменить цвет фона, но я не знаю, как или где использовать метод clearSelection()
дерева, когда я щелкаю по дереву.
Вот код, который я использую:
Пример:
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;
public class JTreeSelectDeselect {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
JTree tree = new JTree();
tree.setCellRenderer(new DeselectTreeCellRenderer());
panel.add(tree, BorderLayout.LINE_START);
panel.add(new JScrollPane(new JTextArea(10, 30)));
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
}
class DeselectTreeCellRenderer extends DefaultTreeCellRenderer {
@Override
public Color getBackgroundSelectionColor() {
return new Color(86, 92, 160);
}
@Override
public Color getBackground() {
return (null);
}
@Override
public Color getBackgroundNonSelectionColor() {
return new Color(23, 27, 36);
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, sel, exp, leaf, row, hasFocus);
setForeground(new Color(225, 225, 221, 255));
setOpaque(false);
return this;
}
}
Здесь я показываю, как я создаю узлы и добавляю их в дерево, используя модель дерева, и как я настраиваю свой пользовательский TreeCellRenderer
.
В средстве визуализации я закрашиваю выбранный узел определенным цветом, а если узел не выбран, я закрашиваю его другим цветом. Когда я изменяю выбор узлов, их фон отображается правильно, но когда я щелкаю за пределами дерева, выбранный узел не отменяется, поэтому он не закрашивается конкретным цветом, установленным в средстве визуализации ячеек.
Есть ли способ отменить выбор узла, когда я щелкаю вне дерева?
И если кто-то знает, есть ли способ изменить некоторые листья с помощью флажков TreeCellRenderer
? Чтобы у некоторых детей были метки, а у других - флажки. Потому что, когда я пытаюсь добавить флажки, он говорит (как я и ожидал), что флажки не являются DefaultMutableTreeNode
объектами, и я не могу добавить их в древовидную модель.