2016-04-06 8 views
3

Я использую модель таблицы дерева в своем приложении, которая расширяет AbstractTreeTableModel, чтобы создать JXTreeTable. Ниже моя модель.Модель JXTreeTable не позволяет использовать insertNodeInto()

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().

Кто-нибудь, пожалуйста, дайте мне знать, где я ошибаюсь в коде. Это первый раз, когда я использую таблицы деревьев, чтобы что-то не хватало.

ответ

1

insertNodeInto - это метод DefaultTreeTableModel, но не один из AbstractTreeTableModel.

Сообщите, пожалуйста, MyDataModelDefaultTreeTableModel, а не AbstractTreeTableModel, чтобы использовать insertNodeInto.

При обращении к TreeTableModel через JXTreeTable#getTreeTableModel, не забудьте бросить возвращаемый объект типа TreeTableModel в DefaultTreeTableModel перед вызовом insertNodeInto.

+0

Я нашел ту же проблему до нескольких минут и соответствующим образом изменил код. – sher17

0

Я нашел, где я поступил не так. Я расширил класс MyDataModel с помощью DefaultTreeTableModel и сделал мой класс узлов (я использую собственный класс узлов), расширяя DefaultMutableTreeTableNode, что дало решение использовать метод insertNodeInto для получения текущего выбранного узла таблицы дерева.