`
icefire
  • 浏览: 125019 次
  • 性别: Icon_minigender_1
  • 来自: 深圳、重庆
社区版块
存档分类
最新评论

swing tree checkbox

阅读更多
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);
					}
				}
			}
		}
	}
}

0
0
分享到:
评论

相关推荐

    TreeCheckBox

    - 对于Java开发者,可以使用Swing或JavaFX库中的JTree和DefaultTreeModel,结合自定义CellRenderer来创建TreeCheckBox。 - 对于.NET平台,WinForms或WPF框架提供了TreeView控件,可以添加CheckBoxes并设置其属性。 -...

    CheckBoxTree

    在Java中,可以使用Swing或JavaFX库来实现CheckBoxTree。在Swing中,可以自定义`DefaultTreeModel`并结合`JTree`和`DefaultTreeCellRenderer`来显示带有复选框的节点。而在JavaFX中,可以利用`TreeView`类的`...

    JTree(节点带有checkbox)代码实例2

    import javax.swing.tree.TreeCellRenderer; import javax.swing.*; import java.awt.*; public class CheckboxTreeCellRenderer extends DefaultTreeCellRenderer { private JCheckBox checkbox; public ...

    Java中带复选框的树(Java CheckBox Tree)的实现和应用.doc

    总结来说,Java 中实现带复选框的树(CheckBox Tree)需要自定义 TreeNode 类(CheckBoxTreeNode),用于存储结点是否被选中的状态,并实现选中/取消选中时子结点和父结点的状态更新。同时,还需要创建一个 ...

    JTree(节点带有checkbox)代码实例

    首先,我们需要导入必要的Java Swing库,包括`javax.swing.JTree`、`javax.swing.tree.DefaultTreeModel`、`javax.swing.tree.DefaultMutableTreeNode`等。`DefaultMutableTreeNode`用于构建树结构,`...

    checkBoxTree 树

    在Java中,比如使用Swing或JavaFX可以创建桌面应用的`checkBoxTree`;在Web开发中,JavaScript库如jQuery、React、Vue或Angular等可以用来构建前端的`checkBoxTree`。这里的标签提到了“java js”,表明实现可能是跨...

    swing复选框树

    在Java Swing库中,"复选框树"(Checkbox Tree)是一种可视化的组件,它将树形结构的数据与复选框结合,用户可以选择或取消选择树中的节点。这个组件非常适合于展示具有层次关系且需要多选操作的数据。下面我们将...

    Java带复选框的树(Java CheckBox Tree)实现和应用

    Java带复选框的树(Java CheckBox Tree)是一种特殊的树形控件,在Java Swing开发中经常被使用。它的实现和应用主要包含了以下几个方面的知识点: 首先,Java CheckBox Tree与JTree的区别在于CheckBox Tree的每个...

    java Swing带复选框的树

    Java Swing 是Java GUI(图形用户界面)库的一部分,它提供了丰富的组件来构建桌面应用程序。在Swing中,我们可以创建各种用户界面元素,如按钮、文本框、面板等,其中包括树形视图(JTree)。在描述中提到的“java ...

    chekboxtree

    在IT领域,CheckboxTree是一种常见的UI元素,尤其在数据管理和配置界面中十分流行。它将树形结构的数据与复选框相结合,用户可以通过选择或取消选择节点来对数据进行操作。这种控件允许用户批量选择或者层级选择,...

    TreeTableJava实现树形结构表格

    treeTable是跨浏览器、性能很高的jquery的树表组件,它使用非常简单,只需要引用jquery库和一个js文件,接口也很简单。 优点 兼容主流浏览器: 支持IE6和IE6+, Firefox, chrome, Opera, Safari ...

    带复选框的多级目录树,复选框的选择控制子节点父节点 全选和反选

    例如,React中有许多第三方库如`react-checkbox-tree`、`antd`的Tree组件等,它们内置了全选、反选和级联选择的功能。 总结来说,带复选框的多级目录树是一种高效的数据组织和操作方式,结合全选和反选功能,能极大...

    swing实例仿window

    2. **选项框(Checkbox)**: `JCheckBox`是Swing中的复选框组件,允许用户选择一个或多个选项。用户可以选择或取消选择,可以通过`isSelected()`方法检查当前状态,并使用`setSelected()`来改变状态。可以将`...

    jtree

    在Java的Swing库中,`JTree`组件是一个用于展示层次数据的控件,它以树状结构显示数据。`jtree`标题所指的可能是关于如何在`JTree`中添加复选框(checkboxes)的功能。这通常是为了让用户能够多选树中的节点,进行...

    JIDE_Common_Layer_Developer_Guide.pdf

    接下来,文档详细描述了CheckboxList和CheckboxTree组件。CheckboxList类似于列表组件,但允许用户以复选框的形式选择多个选项。CheckboxTree是树形组件的扩展,它为树节点提供了复选框,从而可以实现多选功能。这两...

    JTree with JCheckBox的资料整理

    在Java Swing库中,`JTree`是一个组件,用于显示层次结构的数据,而`JCheckBox`则是一个可以勾选或取消勾选的图形用户界面元素。将`JCheckBox`与`JTree`结合使用,可以在树形结构的节点上提供复选框功能,允许用户...

    (一)如何使用JTree

    JTree是javax.swing.tree包中的一个类,它允许用户通过树状结构浏览数据。每个节点可以有子节点,形成一个可展开和折叠的层次结构。节点通常由DefaultMutableTreeNode类表示,它们可以容纳自定义的数据对象。 创建...

    android 树形复选框

    一个项目用Swing写了一个节点带有Checkbox的树状控件,并有3...SWT的Tree控件本身就可以在节点上加上Checkbox。这也是我喜欢SWT的一个原因。 顺带的,也尝试了一下把一个AWT/Swing控件加到SWT的Composite上,效果非常好

    Java程序设计之swt教程.rar

    - Button、Label、Text、Checkbox、RadioButton等:这些是常见的控件,用于构建用户界面。 - ScrollBar:提供滚动功能,用于处理大量数据的显示。 - Tree和Table:用于展示层次化或表格数据。 4. SWT事件处理: ...

Global site tag (gtag.js) - Google Analytics