2016-04-06 5 views
3

JXTreeTableを作成するためにAbstractTreeTableModelを拡張するツリー・テーブル・モデルを私のアプリケーションで使用しています。以下は私のモデルです。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に新しいノードを追加する必要があるとき、私はそのモデルを取得し、insertNodeInto()関数呼び出しが、モデルを使用しようと

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()機能をサポートしていません。

誰かが私がコードでどこが間違っているのか教えてください。ツリーテーブルを使用しているため、何か不足している可能性があります。

答えて

1

insertNodeIntoは、DefaultTreeTableModelの方法ですが、AbstractTreeTableModelのいずれでもありません。

AbstractTreeTableModelではなくDefaultTreeTableModelとし、insertNodeIntoを使用できるようにしてください。

TreeTableModel JXTreeTable#getTreeTableModelを通じて、 insertNodeIntoを呼び出す前に DefaultTreeTableModelにタイプ TreeTableModelの返されたオブジェクトをキャストすることを忘れないでアクセスする場合。

+0

私は数分前に同じ問題を発見し、それに応じてコードを変更しました。 – sher17

0

どこが間違っているのか分かりました。 DefaultTreeTableModelでMyDataModelクラスを拡張し、ノードクラスを作成しました(私はカスタムノードクラスを使用しています)DefaultMutableTreeTableNodeを継承しました。これは、insertNodeIntoメソッドを使用してツリーテーブルの現在選択されているノードを取得するソリューションでした。

関連する問題