java jtree checkbox_java – JTree渲染与JCheckBox节点

我能够解决问题.

我创建了一个模型类(TreeNodeModel)来保存相关的节点数据:key,hasCheckBox,isSelected:

public class TreeNodeModel {

int key;

String value;

boolean isSelected=false;

boolean hasCheckBox=false;

public TreeNodeModel() {

}

public TreeNodeModel(int key,String value) {

this.key=key;

this.value = value;

}

public TreeNodeModel(int key,String value,boolean hasCheckBox) {

this.key=key;

this.value = value;

this.hasCheckBox = hasCheckBox;

}

public TreeNodeModel(int key,boolean hasCheckBox,boolean isSelected) {

this.key=key;

this.value = value;

this.hasCheckBox=hasCheckBox;

this.isSelected = isSelected;

}

public boolean isSelected() {

return this.isSelected;

}

public void setSelected(boolean newValue) {

this.isSelected = newValue;

}

public boolean hasCheckBox() {

return this.hasCheckBox;

}

public void setCheckBox(boolean newValue) {

this.hasCheckBox=newValue;

}

public int getKey() {

return this.key;

}

public void setKey(int newValue) {

this.key = newValue;

}

public String getValue() {

return this.value;

}

public void setValue(String newValue) {

this.value = newValue;

}

@Override

public String toString() {

return getClass().getName() + "[" + this.value + "/" + this.isSelected + "]";

// return this.text;

}

}

我创建了一个TreeCellEditor接口的实现:

public class TreeNodeEditor extends AbstractCellEditor implements TreeCellEditor {

private JTree tree;

private TreeNodeModel editedModel = null;

TreeNodeRenderer renderer = new TreeNodeRenderer();

public TreeNodeEditor(JTree tree) {

this.tree=tree;

}

@Override

public boolean isCellEditable(EventObject event) {

boolean editable=false;

if (event instanceof MouseEvent) {

MouseEvent mouseEvent = (MouseEvent) event;

TreePath path = tree.getPathForLocation(mouseEvent.getX(),mouseEvent.getY());

if (path != null) {

Object node = path.getLastPathComponent();

if ((node != null) && (node instanceof DefaultMutableTreeNode)) {

DefaultMutableTreeNode editedNode = (DefaultMutableTreeNode) node;

TreeNodeModel model = (TreeNodeModel) editedNode.getUserObject();

editable = model.hasCheckBox;

} //if (node)

} //if (path)

} //if (MouseEvent)

return editable;

}

public Object getCellEditorValue() {

JCheckBox checkBox = renderer.getCheckBoxRenderer();

TreeNodeModel model = new TreeNodeModel(editedModel.getKey(),checkBox.getText(),checkBox.isSelected());

return model;

}

public Component getTreeCellEditorComponent(JTree tree,int row) {

if (((DefaultMutableTreeNode) value).getUserObject() instanceof TreeNodeModel) {

editedModel = (TreeNodeModel) ((DefaultMutableTreeNode) value).getUserObject();

}

Component editor = renderer.getTreeCellRendererComponent(tree,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;

}

}

关键是在getTreeCellEditorComponent()方法中捕获模型,并在getCellEditorValue()方法中使用它的Key.

建树很容易:

DefaultMutableTreeNode server = new DefaultMutableTreeNode(new TreeNodeModel(0,"Server 01",false));

DefaultMutableTreeNode userFolder = new DefaultMutableTreeNode(new TreeNodeModel(1,"User Folders",false));

server.add(userFolder);

DefaultMutableTreeNode user01 = new DefaultMutableTreeNode(new TreeNodeModel(2,"User 01",true));

userFolder.add(user01);

DefaultMutableTreeNode clientA = new DefaultMutableTreeNode(new TreeNodeModel(3,"Client A",true));

user01.add(clientA);

DefaultMutableTreeNode clientB = new DefaultMutableTreeNode(new TreeNodeModel(4,"Client B",true));

user01.add(clientB);

DefaultMutableTreeNode publicFolder = new DefaultMutableTreeNode(new TreeNodeModel(5,"Public Folders",false));

server.add(publicFolder);

DefaultMutableTreeNode clientC = new DefaultMutableTreeNode(new TreeNodeModel(6,"Client C",true));

publicFolder.add(clientC);

Tree_Nodes.setCellRenderer(new TreeNodeRenderer());

Tree_Nodes.setCellEditor(new TreeNodeEditor(Tree_Nodes));

Tree_Nodes.setModel(new DefaultTreeModel(server);

最后,确定检查哪些节点是检查模型的节点集合(通过按钮)的问题:

private Map checked = new HashMap();

private void Button_CheckedActionPerformed(java.awt.event.ActionEvent evt) {

DefaultTableModel tableModel = ((DefaultTableModel) Table_Nodes.getModel());

tableModel.getDataVector().removeAllElements();

tableModel.fireTableDataChanged();

checked.clear();

DefaultTreeModel treeModel = (DefaultTreeModel) Tree_Nodes.getModel();

DefaultMutableTreeNode root = (DefaultMutableTreeNode) treeModel.getRoot();

getChildNodes(root);

for (Iterator it=checked.entrySet().iterator(); it.hasNext(); ) {

Map.Entry entry = (Map.Entry)it.next();

tableModel.addRow(new Object[] {entry.getKey(),entry.getValue()});

}

Button_Checked.requestFocus();

}

private void getChildNodes(DefaultMutableTreeNode parentNode) {

for (Enumeration e=parentNode.children(); e.hasMoreElements();) {

DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) e.nextElement();

TreeNodeModel model = (TreeNodeModel) childNode.getUserObject();

if (model.hasCheckBox && model.isSelected()) {

checked.put(model.getKey(),model.getValue());

}

//recurse

if (childNode.getChildCount()>0) getChildNodes(childNode);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值