defaulttreecellrenderer
时间: 2023-03-22 18:04:35 浏览: 41
defaulttreecellrenderer是Java Swing中的一个类,用于绘制树形结构中的节点。它是TreeCellRenderer接口的默认实现,可以通过设置JTree的setCellRenderer方法来使用它。它可以绘制节点的文本、图标、背景色等,并且可以根据节点的选中状态、展开状态等进行不同的绘制。
相关问题
treedemo实现复选框
要在TreeDemo中实现复选框,您需要进行以下步骤:
1. 首先,在TreeDemo中创建一个TreeCellRenderer类,用于渲染树节点。您可以继承DefaultTreeCellRenderer类并添加一个复选框来实现这一点。
2. 接下来,您需要重写TreeSelectionModel类的valueForPathChanged方法,以便当复选框的状态更改时更新树的状态。
3. 在TreeDemo的createNodes方法中,为每个节点添加一个TreeSelectionListener来监听复选框的状态更改。
4. 最后,在TreeDemo的main方法中创建一个JFrame并将树添加到该窗口中。
以下是一个简单的示例代码,演示如何在TreeDemo中实现复选框:
```
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
public class TreeDemo extends JPanel implements TreeSelectionListener {
private JTree tree;
private DefaultTreeModel treeModel;
public TreeDemo() {
super(new GridLayout(1,0));
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
treeModel = new DefaultTreeModel(root);
tree = new JTree(treeModel);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
tree.setCellRenderer(new CheckBoxNodeRenderer());
tree.setCellEditor(new CheckBoxNodeEditor(tree));
tree.setEditable(true);
JScrollPane scrollPane = new JScrollPane(tree);
add(scrollPane);
}
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)
tree.getLastSelectedPathComponent();
if (node == null) return;
Object nodeInfo = node.getUserObject();
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("TreeDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TreeDemo newContentPane = new TreeDemo();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
class CheckBoxNodeRenderer implements TreeCellRenderer {
private JCheckBox leafRenderer = new JCheckBox();
private DefaultTreeCellRenderer nonLeafRenderer = new DefaultTreeCellRenderer();
Color selectionBorderColor, selectionForeground, selectionBackground,
textForeground, textBackground;
protected JCheckBox getLeafRenderer() {
return leafRenderer;
}
public CheckBoxNodeRenderer() {
Font fontValue;
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) {
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 DefaultMutableTreeNode)) {
Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
if (userObject instanceof CheckBoxNode) {
CheckBoxNode node = (CheckBoxNode) userObject;
leafRenderer.setText(node.getText());
leafRenderer.setSelected(node.isSelected());
}
}
returnValue = leafRenderer;
} else {
returnValue = nonLeafRenderer.getTreeCellRendererComponent(tree,
value, selected, expanded, leaf, row, hasFocus);
}
return returnValue;
}
}
class CheckBoxNodeEditor extends DefaultTreeCellEditor {
CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();
public CheckBoxNodeEditor(JTree tree) {
super(tree);
}
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row) {
Component editor = renderer.getTreeCellRendererComponent(tree, value,
true, expanded, leaf, row, true);
// editor always selected / focused
ItemListener itemListener = new ItemListener() {
public void itemStateChanged(ItemEvent itemEvent) {
if (stopCellEditing()) {
fireEditingStopped();
}
}
};
if (editor instanceof JCheckBox) {
((JCheckBox) editor).addItemListener(itemListener);
}
return editor;
}
public Object getCellEditorValue() {
JCheckBox checkbox = renderer.getLeafRenderer();
CheckBoxNode checkBoxNode = new CheckBoxNode(checkbox.getText(),
checkbox.isSelected());
return checkBoxNode;
}
}
class CheckBoxNode {
String text;
boolean selected;
public CheckBoxNode(String text, boolean selected) {
this.text = text;
this.selected = selected;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean newValue) {
selected = newValue;
}
public String getText() {
return text;
}
public void setText(String newValue) {
text = newValue;
}
public String toString() {
return getClass().getName() + "[" + text + "/" + selected + "]";
}
}
```
请注意,上面的示例代码可能需要根据您的具体要求进行修改。
JXTreeTable例子
JXTreeTable 是 SwingX 扩展库提供的一个 JTable 的子类,它可以以树状结构展示表格数据。以下是一个简单的 JXTreeTable 的例子:
```
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import org.jdesktop.swingx.JXTreeTable;
public class JXTreeTableExample {
public static void main(String[] args) {
// 构造树状数据模型
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("根节点");
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("节点1");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("节点2");
rootNode.add(node1);
rootNode.add(node2);
DefaultTreeModel treeModel = new DefaultTreeModel(rootNode);
// 构造表格数据模型
Object[][] data = {{"A", "B", "C"}, {"1", "2", "3"}};
String[] columnNames = {"列1", "列2", "列3"};
JTable table = new JTable(data, columnNames);
// 构造 JXTreeTable
JXTreeTable treeTable = new JXTreeTable(treeModel, table.getColumnModel());
treeTable.setRootVisible(false); // 隐藏根节点
treeTable.setShowGrid(false); // 隐藏网格线
treeTable.setColumnControlVisible(true); // 显示列控制器
treeTable.setHorizontalScrollEnabled(true); // 允许水平滚动
treeTable.setTreeCellRenderer(new DefaultTreeCellRenderer()); // 设置树节点渲染器
// 将 JXTreeTable 放入 JFrame 中
JFrame frame = new JFrame("JXTreeTable Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(treeTable));
frame.pack();
frame.setVisible(true);
}
}
```
该例子中,我们构造了一个包含两个节点的树状数据模型,和一个简单的表格数据模型。然后,我们通过传入这两个模型来构造一个 JXTreeTable。最后,我们将 JXTreeTable 放入 JFrame 中展示出来。运行该例子,可以看到一个包含树状结构的表格。