gpt4 book ai didi

java - 从 CheckBoxTree 节点中删除复选框

转载 作者:行者123 更新时间:2023-11-30 09:28:24 26 4
gpt4 key购买 nike

我正在使用 CheckBoxTree 组件来获得一种带有复选框的特殊 JTree。但是,我希望能够在高级节点上没有复选框,因为永远不应该检查它们,它们只是“分支名称”。这是树的一个简单示例:

元数据 - 产品 -产品A -产品B - ETC - 模型 -等等

节点“元数据”因此是树模型的根。由于可用的方便的 setRootVisible 方法(如在 JTree 中),该节点是不可见的。但除了让根不可见之外,我还想删除二级复选框。所以基本上,应该只有产品 A、产品 B 等级别及以下级别的复选框(可以低几个级别)。但我仍然想要二级标签。

我尝试根据描述复选框树组件的此站点实现自定义 CheckboxTreecellRenderer:

http://www.javaworld.com/javaworld/jw-09-2007/jw-09-checkboxtree.html?page=3

不幸的是,这不起作用。与网站上的示例相比,我尝试移动标签和按钮的添加(我不打算使用单选按钮,只是用它来尝试删除标签以保持简单,但我仍然会如果我让它以某种方式工作,请使用复选框)。我移动它们是为了尝试仅在节点将元数据节点作为其父节点时设置按钮,从而从第二级删除按钮。

但这没有用。令人惊讶的是,这个概念本身似乎有效,因为 button.setEnabled(false); (在下面注释掉)确实有效。这会禁用正确级别的按钮。但是如果我尝试不在那里添加按钮,我在任何地方都找不到按钮......

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package se.expertinfo.ditaplugin;

import it.cnr.imaa.essi.lablib.gui.checkboxtree.CheckboxTree;
import it.cnr.imaa.essi.lablib.gui.checkboxtree.CheckboxTreeCellRenderer;
import it.cnr.imaa.essi.lablib.gui.checkboxtree.TreeCheckingModel;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.TreePath;

/**
*
* @author Anders
*/
public class CustomTreeCellRenderer implements CheckboxTreeCellRenderer {

JPanel panel = new JPanel();
JLabel label = new JLabel();
JRadioButton button = new JRadioButton();

public CustomTreeCellRenderer() {
label.setFocusable(true);
label.setOpaque(true);
panel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
// panel.add(button);
// panel.add(label);
button.setBackground(UIManager.getColor("Tree.textBackground"));
panel.setBackground(UIManager.getColor("Tree.textBackground"));
}

@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
label.setText(value.toString());
if (selected) {
label.setBackground(UIManager.getColor("Tree.selectionBackground"));
} else {
label.setBackground(UIManager.getColor("Tree.textBackground"));
}
TreeCheckingModel checkingModel = ((CheckboxTree) tree).getCheckingModel();

TreePath path = tree.getPathForRow(row);


boolean enabled = checkingModel.isPathEnabled(path);
boolean checked = checkingModel.isPathChecked(path);
boolean grayed = checkingModel.isPathGreyed(path);

button.setEnabled(enabled);

if (path != null) {
TreePath parent = path.getParentPath();
if (parent != null) {
if (parent.getLastPathComponent().toString().equalsIgnoreCase("metadata")) {
// button.setEnabled(false);
panel.add(label);
} else {
panel.add(button);
panel.add(label);
button.setSelected(checked);
}
}
}


if (grayed) {
label.setForeground(Color.lightGray);
} else {
label.setForeground(Color.black);
}
button.setSelected(checked);
return panel;
}

@Override
public boolean isOnHotspot(int x, int y) {
return (button.getBounds().contains(x, y));
}
}

最佳答案

exampleisCellEditable() 的实现中使用 isLeaf() 来限制对叶节点的编辑。

附录:要防止在特定级别以上进行编辑,您可以使用如下谓词检查路径上的元素数量:path.getPathCount() > 2

关于java - 从 CheckBoxTree 节点中删除复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14056430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com