我在我的应用程序中使用了一个树表模型,它扩展了AbstractTreeTableModel,以便创建一个JXTreeTable。下面是我的模型。
import org.jdesktop.swingx.treetable.AbstractTreeTableModel;
import org.jdesktop.swingx.treetable.DefaultTreeTableModel;
import org.jdesktop.swingx.treetable.TreeTableModel;
import javax.swing.tree.TreeModel;
public class MyDataModel extends AbstractTreeTableModel{
static protected String[] columnNames = { "Field", "Value" };
static protected Class<?>[] columnTypes = { Object.class, Object.class};
public MyDataModel(MyDataNode rootNode) {
super(rootNode);
root = rootNode;
}
@Override
public Object getChild(Object parent, int index) {
return ((MyDataNode) parent).getChildren().get(index);
}
@Override
public int getChildCount(Object parent) {
return ((MyDataNode) parent).getChildren().size();
}
@Override
public int getIndexOfChild(Object parent, Object child) {
return 0;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public Class<?> getColumnClass(int column) {
return columnTypes[column];
}
@Override
public Object getValueAt(Object node, int column) {
MyDataNode mNode=(MyDataNode)node;
Object obj =mNode.getNodeDataObject();
if(column==0){
return mNode.getName();
}
else if (column==1){
if(obj instanceof Field){
Field field=(Field)mNode.getNodeDataObject();
if(field.getFieldDef().getListValue().size()>0){
return field.getFieldDef().getListValue();
}
else
return mNode.getDefaultValue();
}
else
return mNode.getDefaultValue();
}
return null;
}
@Override
public boolean isCellEditable(Object node, int column) {
//only allow Field values to be editable
if(((MyDataNode)node).getNodeDataObject() instanceof Field && column==1)
return true;
else
return false;
}
@Override
public boolean isLeaf(Object node) {
MyDataNode mNode=(MyDataNode)node;
Object obj=mNode.getNodeDataObject();
if(obj instanceof Field){
Field field=(Field)obj;
if(field.getFieldDef().getDataType().equalsIgnoreCase("MULTIPLE_MESSAGE")){
return false;
}
else
return true;
}
return false;
}
@Override
public void setValueAt(Object aValue, Object node, int column) {
MyDataNode mNode=(MyDataNode)node;
if (mNode.getNodeDataObject() instanceof Field && column == 1) {
Field field = (Field) mNode.getNodeDataObject();
field.setDefaultValue(aValue);
field.setSelectedValue(aValue);
}
}
}这就是我如何在我的应用程序中使用JXTreeTable。
MyDataModel treeTableModel = new MyDataModel(createDataStructure(message));
jTreeTable = new JXTreeTable(treeTableModel);
private static MyDataNode createDataStructure(Message message) {
//setting fields as children of the root
nodeList = new ArrayList<>();
for (int index=0;index<message.getListFields().size() ; index++) {
if(message.getListFields().get(index).getFieldDef()
.getDataType().equalsIgnoreCase("MULTIPLE_MESSAGE")){
nodeList.add(new MyDataNode(message.getListFields()
.get(index).getFieldDef().getfName(), "", childMessagesRoot,
message.getListFields().get(index)));
}
else{
nodeList.add(new MyDataNode(message.getListFields()
.get(index).getFieldDef().getfName(), (String)(message.getListFields().
get(index).getDefaultValue()),
null,message.getListFields().get(index)));
}
}
//setting the Message to the root of the tree
root = new MyDataNode(message.getMsgName(), "", nodeList,message);
return root;
}当我需要向JXTreeTable添加一个新节点时,我尝试获取它的模型并使用insertNodeInto()函数调用,但是该模型不支持insertNodeInto()函数。
有人请让我知道我的代码哪里出错了。这是我第一次使用树表,所以可能缺少一些东西。
发布于 2016-04-06 11:53:35
insertNodeInto是DefaultTreeTableModel的一种方法,但不是AbstractTreeTableModel的一种方法。
让MyDataModel扩展DefaultTreeTableModel而不是AbstractTreeTableModel以便能够使用insertNodeInto。
通过TreeTableModel访问JXTreeTable#getTreeTableModel时,请记住在调用insertNodeInto之前将返回的TreeTableModel类型对象转换为DefaultTreeTableModel。
发布于 2016-04-06 17:53:02
我发现我哪里出了问题。我用DefaultTreeTableModel扩展了DefaultTreeTableModel类,并使我的节点类(我使用的是自定义节点类)扩展了DefaultMutableTreeTableNode,这给出了使用insertNodeInto方法获取树表中当前选定节点的解决方案。
https://stackoverflow.com/questions/36449574
复制相似问题