- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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));
}
}
最佳答案
这example在 isCellEditable()
的实现中使用 isLeaf()
来限制对叶节点的编辑。
附录:要防止在特定级别以上进行编辑,您可以使用如下谓词检查路径上的元素数量:path.getPathCount() > 2
。
关于java - 从 CheckBoxTree 节点中删除复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14056430/
我是一名优秀的程序员,十分优秀!