swing标准库,实在有些简陋,很多显然的需求却无法满足,jdk5以前的版本,连表格列的排序功能都没有,swing最大的毛病也在这。最近学习python,同时也学习了一些GUI库,发现基本上tree都支持多列显示,在swing里,你就必须找第三方库了。
废话不说了,还是说说本来的需求。
我是需要在tree的node上显示checkbox。要满足这个需求,最明显的就有两个方法。
1 实现TreeCellRenderer接口,JCheckBox来做渲染,这样就可以,不过这有个问题,就是感观上和默认node实现,有很多差异,一些如选中,焦点,背景色等等,这些在DefaultTreeCellRenderer之类里有很多关于此类的考虑,如果自己再考虑,写一遍,似乎不合适。
2 用icon图片来代替,这是个方法,但是我有个期望是,希望checkbox能跟随look&feel做切换,所以期望是系统采用各个look&feel自己的chekbox。
大家知道,swing是自己画的,这样的话,那么icon也是,也就是说,我可以借用JCheckBox的渲染来渲染treenode的icon。最初想法是,直接用JCheckBox的icon放到DefaultTreeCellRenderer的icon里,但却报错,原因是DefaultTreeCellRenderer父类是JLabel,每个组件的icon的渲染,与组件相关的model是紧密联系的。
void paintIcon(Component c, Graphics g, int x, int y);
不同组件的icon不能直接使用。那么怎么办呢?其实也很简单,保证paintIcon的Component参数与icon一致就行了。
具体代码:
public class CheckboxTreeNodeRenderer extends DefaultTreeCellRenderer implements
TreeCellRenderer {
private static final long serialVersionUID = 1L;
private JCheckBox checkbox = new JCheckBox();
private Icon checkboxIcon = UIManager.getIcon("CheckBox.icon");
private ProxyCheckBoxIcon proxyIcon = new ProxyCheckBoxIcon();
private Font normal;
private Font disabled;
@SuppressWarnings("unchecked")
public CheckboxTreeNodeRenderer() {
normal = getFont().deriveFont(Font.PLAIN);
Map<TextAttribute, Object> attrs = (Map<TextAttribute, Object>) normal.getAttributes();
attrs.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
//attrs.put(TextAttribute.FONT, getFont().deriveFont(Font.ITALIC));
disabled = getFont().deriveFont(attrs);
}
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, selected, expanded,
leaf, row, hasFocus);
if (value instanceof CheckboxTreeNode) {
CheckboxTreeNode ctn = (CheckboxTreeNode) value;
checkbox.setSelected(ctn.isChecked());
setIcon(proxyIcon);
if (ctn.isChecked()) {
setFont(disabled);
if (!selected)
setForeground(Color.GRAY);
} else {
setFont(normal);
//setForeground(Color.BLACK);
}
} else {
setFont(normal);
}
return this;
}
private class ProxyCheckBoxIcon implements Icon, Serializable {
private static final long serialVersionUID = 1L;
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
checkboxIcon.paintIcon(checkbox, g, x, y);
}
@Override
public int getIconWidth() {
return checkboxIcon.getIconWidth();
}
@Override
public int getIconHeight() {
return checkboxIcon.getIconHeight();
}
}
}
以上代码除了实现checbox外,还实现了选中时,把显示文字增加删除线。(反正没找到简单方法,但在QT里很简单)。
下面是选中节点的判断监听类:
public class CheckboxNodeCheckedListener extends MouseAdapter implements MouseListener {
@Override
public void mousePressed(MouseEvent e) {
JTree tree = (JTree) e.getSource();
TreePath clickedPath = tree.getPathForLocation(e.getX(), e.getY());
if (e.getClickCount() == 1) {
if (clickedPath != null && !tree.isEditing()) {
Object node = clickedPath.getLastPathComponent();
if (node instanceof CheckboxTreeNode) {
CheckboxTreeNode treeNode = (CheckboxTreeNode) node;
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
TreeNode[] currPath = model.getPathToRoot(treeNode);
Rectangle rec = tree.getPathBounds(new TreePath(currPath));
if (e.getX() - rec.getX() <= 13) { // 默认为 13x13大小
treeNode.setChecked(!treeNode.isChecked());
model.nodeChanged(treeNode);
}
}
}
}
}
}
分享到:
相关推荐
- 对于Java开发者,可以使用Swing或JavaFX库中的JTree和DefaultTreeModel,结合自定义CellRenderer来创建TreeCheckBox。 - 对于.NET平台,WinForms或WPF框架提供了TreeView控件,可以添加CheckBoxes并设置其属性。 -...
在Java中,可以使用Swing或JavaFX库来实现CheckBoxTree。在Swing中,可以自定义`DefaultTreeModel`并结合`JTree`和`DefaultTreeCellRenderer`来显示带有复选框的节点。而在JavaFX中,可以利用`TreeView`类的`...
import javax.swing.tree.TreeCellRenderer; import javax.swing.*; import java.awt.*; public class CheckboxTreeCellRenderer extends DefaultTreeCellRenderer { private JCheckBox checkbox; public ...
总结来说,Java 中实现带复选框的树(CheckBox Tree)需要自定义 TreeNode 类(CheckBoxTreeNode),用于存储结点是否被选中的状态,并实现选中/取消选中时子结点和父结点的状态更新。同时,还需要创建一个 ...
首先,我们需要导入必要的Java Swing库,包括`javax.swing.JTree`、`javax.swing.tree.DefaultTreeModel`、`javax.swing.tree.DefaultMutableTreeNode`等。`DefaultMutableTreeNode`用于构建树结构,`...
在Java中,比如使用Swing或JavaFX可以创建桌面应用的`checkBoxTree`;在Web开发中,JavaScript库如jQuery、React、Vue或Angular等可以用来构建前端的`checkBoxTree`。这里的标签提到了“java js”,表明实现可能是跨...
在Java Swing库中,"复选框树"(Checkbox Tree)是一种可视化的组件,它将树形结构的数据与复选框结合,用户可以选择或取消选择树中的节点。这个组件非常适合于展示具有层次关系且需要多选操作的数据。下面我们将...
Java带复选框的树(Java CheckBox Tree)是一种特殊的树形控件,在Java Swing开发中经常被使用。它的实现和应用主要包含了以下几个方面的知识点: 首先,Java CheckBox Tree与JTree的区别在于CheckBox Tree的每个...
Java Swing 是Java GUI(图形用户界面)库的一部分,它提供了丰富的组件来构建桌面应用程序。在Swing中,我们可以创建各种用户界面元素,如按钮、文本框、面板等,其中包括树形视图(JTree)。在描述中提到的“java ...
在IT领域,CheckboxTree是一种常见的UI元素,尤其在数据管理和配置界面中十分流行。它将树形结构的数据与复选框相结合,用户可以通过选择或取消选择节点来对数据进行操作。这种控件允许用户批量选择或者层级选择,...
treeTable是跨浏览器、性能很高的jquery的树表组件,它使用非常简单,只需要引用jquery库和一个js文件,接口也很简单。 优点 兼容主流浏览器: 支持IE6和IE6+, Firefox, chrome, Opera, Safari ...
例如,React中有许多第三方库如`react-checkbox-tree`、`antd`的Tree组件等,它们内置了全选、反选和级联选择的功能。 总结来说,带复选框的多级目录树是一种高效的数据组织和操作方式,结合全选和反选功能,能极大...
2. **选项框(Checkbox)**: `JCheckBox`是Swing中的复选框组件,允许用户选择一个或多个选项。用户可以选择或取消选择,可以通过`isSelected()`方法检查当前状态,并使用`setSelected()`来改变状态。可以将`...
在Java的Swing库中,`JTree`组件是一个用于展示层次数据的控件,它以树状结构显示数据。`jtree`标题所指的可能是关于如何在`JTree`中添加复选框(checkboxes)的功能。这通常是为了让用户能够多选树中的节点,进行...
接下来,文档详细描述了CheckboxList和CheckboxTree组件。CheckboxList类似于列表组件,但允许用户以复选框的形式选择多个选项。CheckboxTree是树形组件的扩展,它为树节点提供了复选框,从而可以实现多选功能。这两...
在Java Swing库中,`JTree`是一个组件,用于显示层次结构的数据,而`JCheckBox`则是一个可以勾选或取消勾选的图形用户界面元素。将`JCheckBox`与`JTree`结合使用,可以在树形结构的节点上提供复选框功能,允许用户...
JTree是javax.swing.tree包中的一个类,它允许用户通过树状结构浏览数据。每个节点可以有子节点,形成一个可展开和折叠的层次结构。节点通常由DefaultMutableTreeNode类表示,它们可以容纳自定义的数据对象。 创建...
一个项目用Swing写了一个节点带有Checkbox的树状控件,并有3...SWT的Tree控件本身就可以在节点上加上Checkbox。这也是我喜欢SWT的一个原因。 顺带的,也尝试了一下把一个AWT/Swing控件加到SWT的Composite上,效果非常好
- Button、Label、Text、Checkbox、RadioButton等:这些是常见的控件,用于构建用户界面。 - ScrollBar:提供滚动功能,用于处理大量数据的显示。 - Tree和Table:用于展示层次化或表格数据。 4. SWT事件处理: ...