写了一个简单的带有CheckBox的Tree[Swing]

package checkbox.tree;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;

import javax.swing.JCheckBox;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellRenderer;

/*******************************************************************************
 * 主要是对叶子节点渲染
 * 
 * @author Administrator
 * 
 */
public class MyTreeCellRenderer implements TreeCellRenderer {

	// 叶子节点的JCHECKBOX
	private JCheckBox leafRenderer = new JCheckBox();

	// 默认渲染器
	private DefaultTreeCellRenderer branchRenderer = new DefaultTreeCellRenderer();

	Color selectionBorderColor, selectionForeground, selectionBackground,
			textForeground, textBackground;

	protected JCheckBox getLeafRenderer() {
		return leafRenderer;
	}

	public MyTreeCellRenderer() {
		Font fontValue = UIManager.getFont("Tree.font");
		if (fontValue != null) {
			leafRenderer.setFont(fontValue);
		}
		Boolean booleanValue = (Boolean) UIManager
				.get("Tree.drawsFocusBorderAroundIcon");
		leafRenderer.setFocusPainted((booleanValue != null)
				&& (booleanValue.booleanValue()));

		selectionBorderColor = UIManager.getColor("Tree.selectionBorderColor");
		selectionForeground = UIManager.getColor("Tree.selectionForeground");
		selectionBackground = UIManager.getColor("Tree.selectionBackground");
		textForeground = UIManager.getColor("Tree.textForeground");
		textBackground = UIManager.getColor("Tree.textBackground");
	}

	public Component getTreeCellRendererComponent(JTree tree, Object value,
			boolean selected, boolean expanded, boolean leaf, int row,
			boolean hasFocus) {

		Component returnValue;
		// 如果是叶节点
		if (leaf) {
			// leftNode的文本信息
			String stringValue = tree.convertValueToText(value, selected,
					expanded, leaf, row, false);
			leafRenderer.setText(stringValue);
			leafRenderer.setSelected(false);

			leafRenderer.setEnabled(tree.isEnabled());

			if (selected) {
				leafRenderer.setForeground(selectionForeground);
				leafRenderer.setBackground(selectionBackground);
			} else {
				leafRenderer.setForeground(textForeground);
				leafRenderer.setBackground(textBackground);
			}

			if ((value != null) && (value instanceof MyTreeNode)) {
				MyTreeNode leafNode = (MyTreeNode) value;
				leafRenderer.setSelected(leafNode.isSelected());
			}
			returnValue = leafRenderer;
		} else {
			returnValue = branchRenderer.getTreeCellRendererComponent(tree,
					value, selected, expanded, leaf, row, hasFocus);
		}
		return returnValue;
	}
}


 

package checkbox.tree;

import javax.swing.tree.DefaultMutableTreeNode;

/*******************************************************************************
 * 对DefaultMutableTreeNode做了一点点扩展
 * 
 * @author Administrator
 * 
 */
public class MyTreeNode extends DefaultMutableTreeNode {
	/**
	 * 
	 */
	private static final long serialVersionUID = 8188282878055221787L;

	private boolean selected;

	public MyTreeNode() {

	}

	public MyTreeNode(String userObj, boolean selected) {
		super(userObj);
		this.selected = selected;
	}

	public boolean isSelected() {
		return selected;
	}

	public void setSelected(boolean selected) {
		this.selected = selected;
	}
}


 

package checkbox.tree;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JTree;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

/*******************************************************************************
 * 树 必须使用{DefaultTreeModel} 所有节点都是{MyTreeNode} 实现了鼠标单击事件
 * 
 * @author Administrator
 * 
 */
public class CheckableTree extends JTree implements MouseListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1775401228266162344L;

	public CheckableTree(MyTreeNode root) {
		super(new DefaultTreeModel(root));
		setCellRenderer(new MyTreeCellRenderer());
		addMouseListener(this);
		expandRow(0);
	}

	public void mouseClicked(MouseEvent me) {
		TreePath tp = getPathForLocation(me.getX(), me.getY());
		if (tp != null) {
			MyTreeNode node = (MyTreeNode) tp.getLastPathComponent();
			if (node.isLeaf()) {
				node.setSelected(!node.isSelected());
				((DefaultTreeModel) getModel()).nodeChanged(node);
			}
		}
	}

	public List<MyTreeNode> getCheckedNode() {
		List<MyTreeNode> selectedNodes = new ArrayList<MyTreeNode>();
		MyTreeNode root = (MyTreeNode) getModel().getRoot();
		traverse(root, selectedNodes);
		return selectedNodes;
	}

	private void traverse(MyTreeNode node, List<MyTreeNode> selectedNodes) {
		for (int i = 0; i < node.getChildCount(); i++) {
			MyTreeNode child = (MyTreeNode) node.getChildAt(i);
			if (!child.isLeaf())
				traverse(child, selectedNodes);
			else {
				if (child.isSelected())
					selectedNodes.add(child);
			}
		}
	}

	public void mouseEntered(MouseEvent e) {

	}

	public void mouseExited(MouseEvent e) {

	}

	public void mousePressed(MouseEvent e) {

	}

	public void mouseReleased(MouseEvent e) {

	}
}


 

package checkbox.tree;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;

/*******************************************************************************
 * 
 * 主窗口,程序入口
 * 
 * @author Administrator
 * 
 */
public class StartFrame extends JFrame implements ActionListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8074831743596233348L;

	CheckableTree ct = null;

	public StartFrame() {
		setTitle("CheckBox Tree");

		initTree();

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(600, 450);
		setLocationRelativeTo(null);
		setVisible(true);
	}

	public void initTree() {
		// 组织树结构
		MyTreeNode root = new MyTreeNode("Root", false);
		MyTreeNode child1 = new MyTreeNode("Accessibility", false);
		MyTreeNode child2 = new MyTreeNode("Browsing", false);
		root.add(child1);
		root.add(child2);

		child1.add(new MyTreeNode("Do you have lunch?", true));
		child1.add(new MyTreeNode("Run this Application", true));
		child2.add(new MyTreeNode("Disable script debugging", true));
		child2.add(new MyTreeNode("Use AutoComplete", true));
		child2.add(new MyTreeNode("Browse in a new process", false));
		child2.add(new MyTreeNode("Speeking quick! Believe you can.", false));

		ct = new CheckableTree(root);
		JScrollPane scrollPane = new JScrollPane(ct);
		getContentPane().add(scrollPane, BorderLayout.CENTER);

		JButton button = new JButton("测试");
		button.addActionListener(this);
		this.getContentPane().add(button, BorderLayout.SOUTH);
	}

	public void actionPerformed(ActionEvent e) {
		StringBuilder sb = new StringBuilder();
		List<MyTreeNode> list = ct.getCheckedNode();
		Iterator<MyTreeNode> iter = list.iterator();
		while (iter.hasNext()) {
			MyTreeNode node = iter.next();
			sb.append(node.getUserObject());
			sb.append("\r\n");
		}
		JOptionPane.showMessageDialog(this, sb.toString());
	}

	public static void main(String args[]) {
		new StartFrame();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值