从自定义渲染器的 getTreeCellRendererComponent 方法中获取 JTree 节点文本

Get JTree node text inside method getTreeCellRendererComponent from the custom renderer

我正在自定义一个 JTree,所以一些节点有复选框,使用 santhosh tekuri's work 作为基础。

所以我的想法是编写一个自定义的 TreeCellRenderer,在本例中它扩展了 JPanel 并实现了 TreeCellRenderer,然后在方法 getTreeCellRendererComponent 中我必须决定每个节点是否接收复选框。

我已经看到了一些典型的 JTree 自定义每个节点图标的其他示例,但它们依赖于将每个节点转换为 JLabel 并获取其文本,而这里是 JPanel。

这是我的渲染器的样子:

public class CheckTreeCellRenderer extends JPanel implements TreeCellRenderer{

    private CheckTreeSelectionModel selectionModel;
    private TreeCellRenderer delegate;
    private TristateCheckBox checkBox;
    protected CheckTreeManager.CheckBoxCustomizer checkBoxCustomer;


    public CheckTreeCellRenderer(TreeCellRenderer delegate, CheckTreeSelectionModel selectionModel){
        this.delegate = delegate;
        this.selectionModel = selectionModel;
        this.checkBox = new TristateCheckBox("");
        this.checkBox.setOpaque(false);
        setLayout(new BorderLayout());
        setOpaque(false);
    }


    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){
        Component renderer = delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);

        // Inside this if clause, those cells which do not require checkbox will be returned
        if({CODE_TO_GET_NODE_TEXT}.startsWith("A")){
            return renderer;
        }

        TreePath path = tree.getPathForRow(row);
        if(path != null){
            if(checkBoxCustomer != null && !checkBoxCustomer.showCheckBox(path)){
                return renderer;
            }
            if(selectionModel.isPathSelected(path, selectionModel.isDigged())){
                checkBox.getTristateModel().setState(TristateState.SELECTED);
            }
            else{
                checkBox.getTristateModel().setState(selectionModel.isDigged() && selectionModel.isPartiallySelected(path) ? TristateState.INDETERMINATE : TristateState.DESELECTED);
            }
        }
        removeAll();
        add(checkBox, BorderLayout.WEST);
        add(renderer, BorderLayout.CENTER);

        return this;
    }
}

在这种情况下,我想避免为那些文本以 "A" 开头的单元格设置三态复选框作为示例。但是我找不到从值参数中获取文本的方法。

如果有帮助,这就是我创建 JTree 的方式:

DefaultMutableTreeNode root = new DefaultMutableTreeNode();
JTree tree = new JTree(root);

// Add nodes to the tree
DefaultMutableTreeNode friends_node = new DefaultMutableTreeNode("Friends");
    friends_node.add(new DefaultMutableTreeNode("Anna"));
    friends_node.add(new DefaultMutableTreeNode("Amador"));
    friends_node.add(new DefaultMutableTreeNode("Jonas"));
    friends_node.add(new DefaultMutableTreeNode("Mike"));
    friends_node.add(new DefaultMutableTreeNode("Anthony"));
    friends_node.add(new DefaultMutableTreeNode("Maya"));
    friends_node.add(new DefaultMutableTreeNode("Pepe Vinyuela"));
root.add(friends_node);

tree.setCellRenderer(renderer = new CheckTreeCellRenderer(tree.getCellRenderer(), new CheckTreeSelectionModel(tree.getModel(), dig)));

有什么想法吗?

如果您使用 String userObject = "Anna"; new DefaultMutableTreeNode(userObject);, then you might be able to use the DefaultMutableTreeNode#getUserObject() 方法:

@Override public Component getTreeCellRendererComponent(
    JTree tree, Object value, boolean selected, boolean expanded,
    boolean leaf, int row, boolean hasFocus) {
  Component renderer = delegate.getTreeCellRendererComponent(
    tree, value, selected, expanded, leaf, row, hasFocus);
  if (value instanceof DefaultMutableTreeNode) {
    Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
    // Inside this if clause, those cells which do not require checkbox will be returned
    if(userObject instanceof String && ((String) userObject).startsWith("A")){
      return renderer;
    }
    //...