java - JXTreeTable 模型不允许使用 insertNodeInto()

标签 java swing swingx jxtreetable jtreetable

我在我的应用程序中使用树表模型,它扩展了 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() 函数。

有人请让我知道我在代码中哪里出错了。这是我第一次使用树表,所以可能会遗漏一些东西。

最佳答案

insertNodeIntoDefaultTreeTableModel 的一个方法, 但不是 AbstractTreeTableModel 之一.

MyDataModel 扩展 DefaultTreeTableModel 而不是 AbstractTreeTableModel 以便能够使用 insertNodeInto

当通过JXTreeTable#getTreeTableModel访问TreeTableModel时,记得将返回的TreeTableModel类型的对象转换为DefaultTreeTableModel 在调用 insertNodeInto 之前。

关于java - JXTreeTable 模型不允许使用 insertNodeInto(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36449574/

相关文章:

java - 正则表达式匹配字符但不在正则表达式内

java - 在 Java 中执行 GET 并添加 header 请求后发送 POST 失败

java - JTable 中的 JButton 单击时不显示动画

java - 在嵌入式 JOptionPane 上按是/否无效

java - 排序 Controller : how to use a dynamic filter

java - 根据前一行 JXTreeTable 中的值绘制单元格某些颜色

java - 使用骰子的二十一点游戏

java - 我将如何使用整数分隔符? ( java )

java - Jcombobox,当选择某个项目时,显示一个值

java - 无法使用 Maven 构建 swingx-all jar