当前位置: 首页 > 知识库问答 >
问题:

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

姬裕
2023-03-14

我正在使用santhosh tekuri的工作作为基础,自定义JTree,以便某些节点具有复选框。

因此,我们的想法是编写一个自定义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”开头的单元格设置三态复选框。但是我找不到从value参数获取文本的方法

如果有帮助,我将这样创建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)));

有什么想法吗?

共有1个答案

咸利
2023-03-14

如果您使用的是字符串userObject=“Anna” <代码>新建DefaultMutableTreeNode(userObject) ,则可以使用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;
    }
    //...
 类似资料:
  • 节点类 成员变量 变量 类型 名称 备注 id number 标识 无 name string 名称 无 position Object 位置 结构为 {x:0,y:0,z:0} scale Object 缩放比例 结构为 {x:0,y:0} 分别标识x方向和y方向上的缩放系数 rotation Object 旋转 结构为 {x:0,y:0,z:0} 绕x,y,z轴逆时针旋转 vertexColo

  • 我对React Router中路由的渲染顺序有问题。据我所知,任何子路由都将在其父路由之后进行渲染,因此将在DOM中的父路由之上进行渲染。 <代码> 我有这个路由器设置,但是在我从IndexRoute导航到/browse路由之后,浏览路由呈现在我的导航组件的顶部,我不能单击导航组件上的任何内容。 我的问题是如何强制Nav组件始终最后渲染,或者是否有更好的方法来构建我的应用程序以避免这种情况。 谢谢

  • 本文向大家介绍vue 自定义指令自动获取文本框焦点的方法,包括了vue 自定义指令自动获取文本框焦点的方法的使用技巧和注意事项,需要的朋友参考一下 HTML: js: 官方例子: 我的: 在我的项目中使用官方的例子时,input不能自动获取焦点,使用我的js时可自动获取焦点,查询相关资料后知道,insert是一个钩子函数,只要父节点存在,在插入父节点时调用,我这里并没有插入所以没有调用,所以还是要

  • 我正在组装我的第一个基于react的应用程序。我有一个工作应用程序,并已在反应路由器编织。我和巴贝尔在一起。 我在chrome的开发者控制台上得到了以下信息- 我在components/Login.js上有以下组件 在我的app.js我有以下几点- 我认为我的错误在于我导出/导入我的组件的方式,因为错误存在于另一个组件中,并且当我更改上面第一个导入的组件时,错误落在该组件上。 我尝试了各种方法,如

  • 问题内容: 我有一段这样的HTML: 我有一个与此HTML匹配的WebElement。如何从中仅提取“标题”?方法.getText()返回“ Title \ nAuthor”。 问题答案: 您无法在WebDriver API中执行此操作,而必须在代码中执行。例如: 请注意,结尾的换行符实际上是元素文本的一部分,因此,如果您不想要它,则需要将其删除。

  • 加载页面时 <div id="root"></div> 这样的占位空节点在 js bundle 未生效前表现为白屏。网速差 js bundle 加载慢时,白屏时间增长会造成不好的体验。 节点快照可将 HTML 容器填充为用户上一次访问时对应的内容,极速展示页面内容,提升首屏加载速度。 第一步:在工程配置 build.json 中的 build-plugin-rax-pwa 添加 snapshot