我有一段带JCheckBox的JTree源码,它的功能是每个节点都加了JCheckBox:import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.util.Enumeration; /**
* @author Administrator
*
*/
public class WorkTree { JTree newtr = null; DefaultTreeModel treemodel = null; JTextArea textarea = new JTextArea(); public String NewNodeName; public static void main(String[] args) {
new WorkTree();
} public WorkTree() { // 生成树结构
// JCheckBox chbox = new JCheckBox("aa");
DefaultMutableTreeNode treecode = new DefaultMutableTreeNode("c:\\",
true);
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("Windows");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("Drivers");
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("System32");
treecode.add(node1);
treecode.add(node2);
node1.add(node3);
treecode.add(new DefaultMutableTreeNode("Config.sys"));
treecode.add(new DefaultMutableTreeNode("Boot.ini"));
node1.add(new DefaultMutableTreeNode("Explorer.exe"));
node1.add(new DefaultMutableTreeNode("Regedit.exe"));
node2.add(new DefaultMutableTreeNode("Sound"));
node2.add(new DefaultMutableTreeNode("VGA"));
node3.add(new DefaultMutableTreeNode("ipconfig.exe"));
node3.add(new DefaultMutableTreeNode("net.exe"));
newtr = new JTree(treecode);
CheckboxTreeRender cbtr=new CheckboxTreeRender();
newtr.setCellRenderer(cbtr);
newtr.setRowHeight(20);
// newtr.add(chbox);
treemodel = (DefaultTreeModel) newtr.getModel(); // MyTreeCellRenderer newTreeNode = new MyTreeCellRenderer();
// newTreeNode. // 将所有结点展开
expandAll(newtr, new TreePath(newtr.getModel().getRoot())); // 添加树的选择事件
newtr.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
// try {
JTree tree = (JTree) e.getSource();
//CheckboxTreeRender ct=(CheckboxTreeRender)tree.getCellRenderer();
DefaultMutableTreeNode selectNode = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();
textarea.setText(selectNode.toString() + "被选中.\n");
//textarea.setText(ct.toString());
//Data data = (Data) ((DefaultMutableTreeNode) e.getSource()).getUserObject();
// } catch (Exception E) {
// return;
// }
}
}); // 生成面板
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1, 2));
panel.add(new JScrollPane(newtr));
panel.add(new JScrollPane(textarea));
// panel.add(new JScrollPane(new MyTreeCellRenderer())); JFrame frame = new JFrame("TreeWork");
frame.setSize(500, 350);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setJMenuBar(new NewJMnu());
frame.setContentPane(panel);
// frame.pack();
frame.setVisible(true);
} class NewJMnu extends JMenuBar {
public NewJMnu() {
// 菜单事件
ActionListener menuAction = new ActionListener() {
public void actionPerformed(ActionEvent event) {
if (event.getActionCommand().equals("Create")) {
try {
String NameBox = (String) JOptionPane
.showInputDialog(null, "Input the name:",
"Create Node",
JOptionPane.PLAIN_MESSAGE);
NewNodeName = NameBox.toString();
if (NameBox.length() < 1) {
textarea.setText("Please input a true name!");
return;
}
;
DefaultMutableTreeNode parentNode = null;
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
NewNodeName);
// newNode.setAllowsChildren(true);
TreePath parentPath = newtr.getSelectionPath();
if (parentPath == null) {
textarea.setText("Please select a node!");
return;
} parentNode = (DefaultMutableTreeNode) (parentPath
.getLastPathComponent());
treemodel.insertNodeInto(newNode, parentNode,
parentNode.getChildCount());
newtr.scrollPathToVisible(new TreePath(newNode
.getPath()));
} catch (Exception E) {
}
;
}
;
if (event.getActionCommand().equals("Delete")) {
TreePath[] newtrpath = newtr.getSelectionPaths();
try {
if (newtrpath != null) {
DefaultMutableTreeNode selectionNode = (DefaultMutableTreeNode) newtr
.getLastSelectedPathComponent();
TreeNode parent = (TreeNode) selectionNode
.getParent();
if (parent != null && selectionNode != null) {
treemodel
.removeNodeFromParent(selectionNode);
}
} else {
textarea.setText("Please select a node!");
// JOptionPane.showMessageDialog(null,
// "请选择要删除的结点!");
}
} catch (Exception E) {
}
}
;
if (event.getActionCommand().equals("About")) {
textarea.setText("2006.12");
}
;
if (event.getActionCommand().equals("Exit")) {
System.exit(0);
}
;
}
}; // jMnu菜单
JMenu NodeMenu = new JMenu("Node");
JMenu HelpMenu = new JMenu("Help");
JMenuItem item1 = new JMenuItem("Create");
JMenuItem item2 = new JMenuItem("Delete");
JMenuItem item3 = new JMenuItem("About");
JMenuItem item4 = new JMenuItem("Exit");
item1.addActionListener(menuAction);
item2.addActionListener(menuAction);
item3.addActionListener(menuAction);
item4.addActionListener(menuAction);
NodeMenu.add(item1);
NodeMenu.add(item2);
HelpMenu.add(item3);
HelpMenu.add(item4);
add(NodeMenu);
add(HelpMenu);
} } // 展开所有结点
public static void expandAll(JTree tree, TreePath path) {
// assert (tree != null) && (path != null);
tree.expandPath(path);
TreeNode node = (TreeNode) path.getLastPathComponent();
for (Enumeration i = node.children(); i.hasMoreElements();) {
expandAll(tree, path.pathByAddingChild(i.nextElement()));
}
} class CheckboxTreeRender extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
JCheckBox box = new JCheckBox();
box.setText(value.toString());
box.setSelected(sel);
//box.setBackground(Color.white);
return box;
}
}
} 现在我想要的是只有最底层节点才能加JCheckBox,其他节点不加,该如何修改或实现呢?
import javax.swing.*;
import java.awt.event.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.util.Enumeration; /**
* @author Administrator
*
*/
public class WorkTree { JTree newtr = null; DefaultTreeModel treemodel = null; JTextArea textarea = new JTextArea(); public String NewNodeName; public static void main(String[] args) {
new WorkTree();
} public WorkTree() { // 生成树结构
// JCheckBox chbox = new JCheckBox("aa");
DefaultMutableTreeNode treecode = new DefaultMutableTreeNode("c:\\",
true);
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("Windows");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("Drivers");
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("System32");
treecode.add(node1);
treecode.add(node2);
node1.add(node3);
treecode.add(new DefaultMutableTreeNode("Config.sys"));
treecode.add(new DefaultMutableTreeNode("Boot.ini"));
node1.add(new DefaultMutableTreeNode("Explorer.exe"));
node1.add(new DefaultMutableTreeNode("Regedit.exe"));
node2.add(new DefaultMutableTreeNode("Sound"));
node2.add(new DefaultMutableTreeNode("VGA"));
node3.add(new DefaultMutableTreeNode("ipconfig.exe"));
node3.add(new DefaultMutableTreeNode("net.exe"));
newtr = new JTree(treecode);
CheckboxTreeRender cbtr=new CheckboxTreeRender();
newtr.setCellRenderer(cbtr);
newtr.setRowHeight(20);
// newtr.add(chbox);
treemodel = (DefaultTreeModel) newtr.getModel(); // MyTreeCellRenderer newTreeNode = new MyTreeCellRenderer();
// newTreeNode. // 将所有结点展开
expandAll(newtr, new TreePath(newtr.getModel().getRoot())); // 添加树的选择事件
newtr.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
// try {
JTree tree = (JTree) e.getSource();
//CheckboxTreeRender ct=(CheckboxTreeRender)tree.getCellRenderer();
DefaultMutableTreeNode selectNode = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();
textarea.setText(selectNode.toString() + "被选中.\n");
//textarea.setText(ct.toString());
//Data data = (Data) ((DefaultMutableTreeNode) e.getSource()).getUserObject();
// } catch (Exception E) {
// return;
// }
}
}); // 生成面板
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1, 2));
panel.add(new JScrollPane(newtr));
panel.add(new JScrollPane(textarea));
// panel.add(new JScrollPane(new MyTreeCellRenderer())); JFrame frame = new JFrame("TreeWork");
frame.setSize(500, 350);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setJMenuBar(new NewJMnu());
frame.setContentPane(panel);
// frame.pack();
frame.setVisible(true);
} class NewJMnu extends JMenuBar {
public NewJMnu() {
// 菜单事件
ActionListener menuAction = new ActionListener() {
public void actionPerformed(ActionEvent event) {
if (event.getActionCommand().equals("Create")) {
try {
String NameBox = (String) JOptionPane
.showInputDialog(null, "Input the name:",
"Create Node",
JOptionPane.PLAIN_MESSAGE);
NewNodeName = NameBox.toString();
if (NameBox.length() < 1) {
textarea.setText("Please input a true name!");
return;
}
;
DefaultMutableTreeNode parentNode = null;
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(
NewNodeName);
// newNode.setAllowsChildren(true);
TreePath parentPath = newtr.getSelectionPath();
if (parentPath == null) {
textarea.setText("Please select a node!");
return;
} parentNode = (DefaultMutableTreeNode) (parentPath
.getLastPathComponent());
treemodel.insertNodeInto(newNode, parentNode,
parentNode.getChildCount());
newtr.scrollPathToVisible(new TreePath(newNode
.getPath()));
} catch (Exception E) {
}
;
}
;
if (event.getActionCommand().equals("Delete")) {
TreePath[] newtrpath = newtr.getSelectionPaths();
try {
if (newtrpath != null) {
DefaultMutableTreeNode selectionNode = (DefaultMutableTreeNode) newtr
.getLastSelectedPathComponent();
TreeNode parent = (TreeNode) selectionNode
.getParent();
if (parent != null && selectionNode != null) {
treemodel
.removeNodeFromParent(selectionNode);
}
} else {
textarea.setText("Please select a node!");
// JOptionPane.showMessageDialog(null,
// "请选择要删除的结点!");
}
} catch (Exception E) {
}
}
;
if (event.getActionCommand().equals("About")) {
textarea.setText("2006.12");
}
;
if (event.getActionCommand().equals("Exit")) {
System.exit(0);
}
;
}
}; // jMnu菜单
JMenu NodeMenu = new JMenu("Node");
JMenu HelpMenu = new JMenu("Help");
JMenuItem item1 = new JMenuItem("Create");
JMenuItem item2 = new JMenuItem("Delete");
JMenuItem item3 = new JMenuItem("About");
JMenuItem item4 = new JMenuItem("Exit");
item1.addActionListener(menuAction);
item2.addActionListener(menuAction);
item3.addActionListener(menuAction);
item4.addActionListener(menuAction);
NodeMenu.add(item1);
NodeMenu.add(item2);
HelpMenu.add(item3);
HelpMenu.add(item4);
add(NodeMenu);
add(HelpMenu);
} } // 展开所有结点
public static void expandAll(JTree tree, TreePath path) {
// assert (tree != null) && (path != null);
tree.expandPath(path);
TreeNode node = (TreeNode) path.getLastPathComponent();
for (Enumeration i = node.children(); i.hasMoreElements();) {
expandAll(tree, path.pathByAddingChild(i.nextElement()));
}
} class CheckboxTreeRender extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
JCheckBox box = new JCheckBox();
box.setText(value.toString());
box.setSelected(sel);
//box.setBackground(Color.white);
return box;
}
}
} 现在我想要的是只有最底层节点才能加JCheckBox,其他节点不加,该如何修改或实现呢?
解决方案 »
- Hibernate框架中,log4j异常问题。求各位大神帮帮忙!
- Java要用SQL 2005内bigint型数据,如何获得并转换为String型?
- 如何实现画布卷动?
- 高分求答案(请问(1),(2),(3),(4)处分别填写什么?)
- 如何用JAVA代码打开一个IE的指定URL链接呀
- 这个关于JSlider的异常是什么意思?
- 文本加密后传输问题要从byte转成char,为什么?
- 终于知道怎样揭贴拉..在问一个获取网络连接的问题/。。。
- 高分求助!关于Swing方面的问题
- stmt.executeUpdate("insert into st(st_id,st_name)values(st_id,st_name)");???
- 2 --- 火星漫游者问题!!!急
- 求createinstall使用教程
@Override
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
if ((row==0)||(row==1)||(row==7)||(row==10)||(row==11)){
JCheckBox box = new JCheckBox();
box.setText(value.toString());
box.setSelected(sel);
//box.setBackground(Color.white);
return box;
}
else{
String stringValue = tree.convertValueToText(value, sel,
expanded, leaf, row, hasFocus); JLabel label = new JLabel(stringValue);
label.setComponentOrientation(tree.getComponentOrientation());
return label;
}
}}改这里,应该可以达到要求。
不知道是不是最好的办法。
class CheckboxTreeRender extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
if (leaf){
JCheckBox box = new JCheckBox();
box.setText(value.toString());
box.setSelected(sel);
//box.setBackground(Color.white);
return box;
}
else{
String stringValue = tree.convertValueToText(value, sel,
expanded, leaf, row, hasFocus);JLabel label = new JLabel(stringValue);
label.setComponentOrientation(tree.getComponentOrientation());
return label;
}
}}试下。是否可行
wolf02009(负无穷) 的可以达到要求了。
john_sheep(彩虹勇士(结贴就那么难么?)) 的没实现有点问题,不过还是很感谢,结帖了!