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();
}
}