【问题标题】:Remove selected node from JTreeTable SwingX error从 JTreeTable SwingX 错误中删除选定节点
【发布时间】:2015-03-01 19:54:45
【问题描述】:

当我试图从 JTreeTable 中删除选定的节点时,我遇到了一个奇怪的错误。 首先,我从 JXtreeTable 获得主类中的选定行

table.getSelectedRow()

我用这个方法来做,它会返回一个正确的行数。 但是,事情发生了。 在我的模型类中,我调用方法删除子项:

    package JTreeTable;

import org.jdesktop.swingx.treetable.AbstractMutableTreeTableNode;
import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode;
import org.jdesktop.swingx.treetable.DefaultTreeTableModel;
import org.jdesktop.swingx.treetable.MutableTreeTableNode;
import org.jdesktop.swingx.treetable.TreeTableModel;

public class TableModel extends DefaultTreeTableModel implements TreeTableModel {


    DefaultMutableTreeTableNode root;// = new DefaultMutableTreeTableNode("Root");

    public TableModel(DefaultMutableTreeTableNode root){
         super(root);//it didnt work without this line. it took me a day to figure it out. I hate my life sometimes.
         this.root = root;

    }

    public int getColumnCount() 
    {
        return 4;
    }

    @Override
    public String getColumnName( int column )
    {
        switch( column )
        {
        case 0: return "Description";
        case 1: return "Amount";
        case 2: return "Date";
        case 3: return "Paid";

        default: return "Unknown";
        }
    }

    public void addChildren(){
        int rootChildCount = root.getChildCount();
        ArrayNode newChild = new ArrayNode(new Object[] {"dfds", "sfddsf","dfsfsd","fdsfsd"});
        this.insertNodeInto(newChild, root, rootChildCount);
    }

    public void removeChildren(int index){
          //root.remove(index);
    System.out.println(root.getChildCount());   

    }

}

这里是我的节点类:

package JTreeTable;

import org.jdesktop.swingx.treetable.AbstractMutableTreeTableNode;
import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode;

public class ArrayNode extends DefaultMutableTreeTableNode {

    public ArrayNode(Object[] data) {
        super(data);
    }

    @Override
    public Object getValueAt(int column) {
        return getUserObject()[column];
    }

    @Override
    public void setValueAt(Object aValue, int column) {
        getUserObject()[column] = aValue;
    }

    @Override
    public int getColumnCount() {
        return 4;
    }

    @Override
    public Object[] getUserObject() {
        return (Object[]) super.getUserObject();
    }

    @Override
    public boolean isEditable(int column) {
        return true;
    }

}

所以,当我使用方法 root.remove(index) 时,我总是得到错误“节点必须是此模型管理的有效节点”。但我很确定我的节点没问题!这意味着什么,是否可以修复?

【问题讨论】:

    标签: java swingx jtreetable


    【解决方案1】:

    您正试图绕过 TreeTableModel 直接从另一个节点移除子节点。使用 DefaultTreeTableModel.removeNodeFromParent,例如:

    public void removeChildren(int index) {
        MutableTreeTableNode node = root.getChildAt(index);
        this.removeNodeFromParent(node);
    }
    

    【讨论】:

    • 是的,我在我的程序中做了类似的事情。你在这里有点晚了:D 但你是对的,所以我还是接受它享受你的新声誉:D
    • 我在遇到同样问题时偶然发现了你的问题,我想我不是最后一个发现这个 SO 问题的人,所以我想我还是可以回答一下。 :-)
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多