Зачеркнутый узел в JTree

В моем проекте у меня есть Jtree с пользовательским узлом (который расширяет DefaultMutableTreeNode). Каждый узел связан с логическим значением. Когда логическое значение False, я хотел бы нанести удар по тексту моего узла. Так, например:

  • узел 1
    • node1.1
    • node1.2
  • узел 2
    • node2.1
    • ...

Я попытался создать новый шрифт, но я не нашел никаких свойств, чтобы нанести удар по тексту, и мне удалось только добавить свой собственный шрифт во все дерево, а не узел за узлом.

Я думаю, что я должен использовать TreeRenderer, но я не могу найти какой-либо метод, который поможет мне ударить узел.

У кого-нибудь есть идея, как я могу это сделать?

2 ответа

Решение

Проверьте пример ниже. Для простоты я просто пробиваю выбранный узел. Вы должны, конечно, использовать свою собственную проверку значения.

package snippet;

import java.awt.Component;
import java.awt.Font;
import java.awt.font.TextAttribute;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultTreeCellRenderer;

public class JTreeTest extends JFrame {
    private final class StrikeoutCellRenderer extends DefaultTreeCellRenderer {
        private static final long serialVersionUID = 1L;

        @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
                boolean leaf, int row, boolean hasFocus) {
            Component c = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
            Font font = c.getFont();
            Map attributes = font.getAttributes();
            if(sel)
                attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
            else
                attributes.remove(TextAttribute.STRIKETHROUGH);
            Font newFont = new Font(attributes);
            c.setFont(newFont);
            return c;
        }

    }

    private static final long serialVersionUID = 1L;

    public JTreeTest() {
        super(JTreeTest.class.getName());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initComponents();
    }

    private void initComponents() {
        JTree tree = new JTree();
        tree.setCellRenderer(new StrikeoutCellRenderer());
        add(tree);
        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override public void run() {
                JTreeTest t = new JTreeTest();
                t.setVisible(true);
            }
        });
    }
}

Обратите внимание, что даже если узел не нуждается в зачистке, вам необходимо сбросить атрибут, так как для рисования всех узлов используется один компонент.

Простейшим способом было бы определить средство визуализации (расширение DefaultTreeCellRenderer) и позвоните setText() передача строки html вот так<html><u>node1.2</u></html>"как значение для зачеркивания.

Другие вопросы по тегам