2015-03-01 3 views
0

У меня возникла странная ошибка, когда я пытаюсь удалить выбранный узел из JTreeTable. Прежде всего, я выбран ряд в моем главном классе от JXtreeTableУдалить выбранный узел из JTreeTable SwingX error

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 (индекс) я всегда получаю ошибку «узел должен быть допустимым узлом, управляемым этой моделью ». Но я уверен, что мои узлы в порядке! Что это значит и можно ли это сделать?

ответ

1

Вы пытаетесь удалить ребенка непосредственно с другого узла, минуя TreeTableModel. Использовать DefaultTreeTableModel.removeNodeFromParent, например:

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

Да, я сделал что-то подобное в своей программе. Вы как-то опаздываете здесь: D Но вы правы, поэтому я принимаю его в любом случае, наслаждаюсь вашей новой репутацией: D – Ophelia

+0

Я просто наткнулся на ваш вопрос, имея такую ​​же проблему, и я думаю, что я не последний, кто нашел это SO вопрос, поэтому я думал, что могу ответить на него в любом случае. :-) – andreas