【问题标题】:Strikethrough a node in a JTree删除 JTree 中的节点
【发布时间】:2015-08-07 07:00:27
【问题描述】:

在我的项目中,我有一个带有自定义节点的 Jtree(它扩展了 DefaultMutableTreeNode)。每个节点都与一个布尔值相关联。当布尔值为 False 时,我想敲击我节点的文本。例如:

  • 节点 1
    • node1.1
    • node1.2
  • 节点 2
    • node2.1
    • ...

我试图创建一个新字体,但我没有找到任何属性来打击文本,我只设法将我的自定义字体添加到整个树而不是逐个节点。

我认为我应该使用 TreeRenderer,但我找不到任何方法来帮助我敲击节点。

有人知道我能做到吗?

【问题讨论】:

标签: java swing jtree strikethrough treecellrenderer


【解决方案1】:

查看下面的示例。为了简单起见,我只是通过选定的节点进行打击。当然,您需要使用自己的值检查。

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);
            }
        });
    }
}

请注意,即使节点不需要删除线,您也需要重置属性,因为单个组件用于绘制所有节点。

【讨论】:

    【解决方案2】:

    最简单的方法是定义一个渲染器(扩展DefaultTreeCellRenderer)并调用setText(),传递像“<html><u>node1.2</u></html>”这样的html字符串作为删除线的值。

    【讨论】:

      猜你喜欢
      • 2011-12-17
      • 1970-01-01
      • 2011-08-03
      • 2012-04-06
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多