我有一个不寻常的情况下,我需要有含2个复选框和标签(与添加侦听器的任何潜在的复选框进行检查时告知的能力)的每个节点一个JTree。 我还需要根节点有相同的布局(这我假设手段创造有2个JCheckBoxes一个JPanel和JLabel),能够选择的所有复选框下的树,如果一个根被检查的能力。
任何指导或例子吗? 我已经签出在这里其中的一些让我去具有树“看”的地步,但没有给我一个方向实现它背后的行动以前的问题和相关的例子...。
谢谢!
我有一个不寻常的情况下,我需要有含2个复选框和标签(与添加侦听器的任何潜在的复选框进行检查时告知的能力)的每个节点一个JTree。 我还需要根节点有相同的布局(这我假设手段创造有2个JCheckBoxes一个JPanel和JLabel),能够选择的所有复选框下的树,如果一个根被检查的能力。
任何指导或例子吗? 我已经签出在这里其中的一些让我去具有树“看”的地步,但没有给我一个方向实现它背后的行动以前的问题和相关的例子...。
谢谢!
这可能是看老的好时机JTreeTable代码,这将给你在第一列呈现一棵树,并自由地使细胞为每列树节点的右侧,如你所愿,你的情况投入复选框和标签,并允许你来你有TableCellEditors你的JTable工作。 警告是,虽然在该链接的代码工作,这是一个有点令人费解。
有一种替代方法。 我已经演示了低于被认为是更好的树表实现,叫Outline
,通过NetBeans的提供(尽管你不需要与NetBeans IDE开发,你只需要JAR)。 这篇文章表明它是多么容易上手。
我能小样纲要树表的Eclipse的一个简单的例子(与进口到我的项目为org-netbeans-摆动outline.jar)在约30分钟(我在打字慢):
private void buildFrame() {
frame = new JFrame("Demo");
frame.setSize(300, 300);
addStuffToFrame();
frame.setVisible(true);
}
private void addStuffToFrame() {
MyTreeNode top = new MyTreeNode("top");
createNodes(top);
DefaultTreeModel model = new DefaultTreeModel(top);
//here are the netBeans tree table classes
OutlineModel outlineModel =
DefaultOutlineModel.createOutlineModel(model, new MyRowModel());
Outline outline = new Outline();
outline.setRootVisible(true);
outline.setModel(outlineModel);
frame.getContentPane().add(new JScrollPane(outline));
}
private void createNodes(MyTreeNode top) {
MyTreeNode child = new MyTreeNode("child 2");
top.add(new MyTreeNode("child 1"));
child.add(new MyTreeNode("g-child1"));
child.add(new MyTreeNode("g-child2"));
child.add(new MyTreeNode("g-child3"));
top.add(child);
top.add(new MyTreeNode("child3"));
top.add(new MyTreeNode("child4"));
}
我创建了一个树节点来保存Boolean
原来决心与国内外互通JTable
的内置复选框渲染mechnanism。
public class MyTreeNode extends DefaultMutableTreeNode {
Boolean data1 = null;
Boolean data2 = null;
String name = null;
MyTreeNode (String name) {
this.name=name;
}
void setData1(Boolean val) {data1=val;}
void setData2(Boolean val) {data2=val;}
Boolean getData1() {return data1;}
Boolean getData2() {return data2;}
String getName() {return name;}
}
在NetBeans RowModel的关键是使之成为一个表,而不是一个简单的JTree:
public class MyRowModel implements RowModel {
public Class getColumnClass(int col) {
switch (col) {
case 0: return String.class;
case 1: return Boolean.class; //these return class definitions will
case 2: return Boolean.class; //trigger the checkbox rendering
default:return null;
}
}
public int getColumnCount() {
return 3;
}
public String getColumnName(int col) {
return "";
}
public Object getValueFor(Object node, int col) {
MyTreeNode n = (MyTreeNode)node;
switch (col) {
case 0: return n.getName();
case 1: return n.getData1();
case 2: return n.getData2();
default:return null;
}
}
public boolean isCellEditable(Object node, int col) {
return col > 0;
}
public void setValueFor(Object node, int col, Object val) {
MyTreeNode n = (MyTreeNode)node;
if (col == 1) {n.setData1((Boolean)val);}
else if (col == 2) {n.setData2((Boolean)val);}
//EDIT: here is a recursive method to set all children
// selected for one of the two checkboxes as it is
// checked by the parent
for (Enumeration children = n.children();
children.hasMoreElements(); ) {
MyTreeNode child = (MyTreeNode) children.nextElement();
setValueFor(child, col, val);
}
}
}
这里是成品,虽然简单,产品:
替代文字http://img17.imageshack.us/img17/6643/picture1hz.png
我已经更新了setValueFor
方法来遍历一个节点的子节点和选择或当父已被修改,取消设置的复选框。
看看http://www.java2s.com/Code/Java/Swing-JFC/CheckBoxNodeTreeSample.htm
目前还不清楚其中buildFrame(),addStuffToFrame()和createNodes()方法去。 我把他们都到我创建的扩展JFrame的一个OutlineJFrame类,并删除了“框架”。 前言何处,以往任何时候都出现了。 然后在我的项目的main()方法,它只是创建的那些OutlineJFrame对象之一,并设置其可见的事实。 当它跑了,我得到了一个可调整大小,但空的窗口。 在哪儿行? 在哪里的节点?
然后我问Geertjan,在NetBeans大师,我在做什么错了,他送我重新写。 但它有相同的行为。
但我知道,我的Java是好的,因为另一个演示项目我做(FileTreeJFrame)显示outline.java对象就好了。