2011-08-31 17 views
2

http://java.sun.com/products/jfc/tsc/articles/treetable2/index.htmlから取得した例を使用しようとしています。ファイルシステムモデルをモデルに置き換えました。JTreeTableの更新

最初にモデルを作成してJTreeTableに表示しますが、モデルを更新してからJTreeTableを更新したいとします(たとえば、ツリーにノードを追加したり、ノードを変更したり、ノードなど)。

どうすればいいのか分かりません。 treeNodesChangedtreeNodesInsertedなどの方法がいくつか表示されていますが、おそらく私はこのJTreeTableコンポーネントのグローバルロジックで何かを見逃しています。

私はモデルを正しく作成しているかどうかはわかりません。さまざまな例で、モデルオブジェクト(model.insertNodeIntomodel.reload)を使用していて、上記の例..In、単にTreeTableModelを実装する抽象クラスAbstractTreeTableModelと呼ばれている。..

更新私のメインクラスで

public class TableModel extends AbstractTreeTableModel 
         implements TreeTableModel { 
static protected String[] cNames = {"TrackNumber", "MWRTN", "LSRTN", "RFTN","TrackStatus","Prova","Prova2"}; 
    // Types of the columns. 
static protected Class[] cTypes = {TreeTableModel.class,Integer.class, Integer.class, Integer.class, Integer.class,String.class,String.class}; 

private ArrayList<Object> data=new ArrayList<Object>(); 
    public void insertNode(Object node) 
    { this.data.add(node); super.setRoot(data.get(0));} 

私はこのように私のモデルにオブジェクトを追加します。

... 
model =new TableModel(); 
model.insertNode(threatList.get(i)); //inserting the root node 
model.addChild(threatList.get(i),threatList.get(j)); // inserting the child 
... 

その後、私は私のJTreeTableにモデルを渡すと、私のフレームに追加します。

treeTable = new JTreeTable(model); 
JScrollPane scroll=new JScrollPane(treeTable); 
scroll.setAutoscrolls(false); 
scroll.setPreferredSize(new Dimension(1000,80)); 
frame.add(scroll); 

そして、これがJTreeTableクラスです:

私はイベントを発生することがあるだろうか
public class JTreeTable extends JTable { 
protected TreeTableCellRenderer tree; 

public JTreeTable(TreeTableModel treeTableModel) { 
super(); 

// Create the tree. It will be used as a renderer and editor. 
tree = new TreeTableCellRenderer(treeTableModel); 

// Install a tableModel representing the visible rows in the tree. 
super.setModel(new TreeTableModelAdapter(treeTableModel, tree)); 

// Force the JTable and JTree to share their row selection models. 
tree.setSelectionModel(new DefaultTreeSelectionModel() { 
    // Extend the implementation of the constructor, as if: 
/* public this() */ { 
    setSelectionModel(listSelectionModel); 
    } 
}); 
// Make the tree and table row heights the same. 
tree.setRowHeight(getRowHeight()); 

// Install the tree editor renderer and editor. 
setDefaultRenderer(TreeTableModel.class, tree); 
setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor()); 

setShowGrid(false); 
setIntercellSpacing(new Dimension(0, 0)); 
setPreferredSize(new Dimension(60,60)); 
} 

/* Workaround for BasicTableUI anomaly. Make sure the UI never tries to 
* paint the editor. The UI currently uses different techniques to 
* paint the renderers and editors and overriding setBounds() below 
* is not the right thing to do for an editor. Returning -1 for the 
* editing row in this case, ensures the editor is never painted. 
*/ 
public int getEditingRow() { 
    return (getColumnClass(editingColumn) == TreeTableModel.class) ? -1 : editingRow; 
} 

// 
// The renderer used to display the tree nodes, a JTree. 
// 

public class TreeTableCellRenderer extends JTree implements TableCellRenderer { 

protected int visibleRow; 

public TreeTableCellRenderer(TreeModel model) { 
    super(model); 
} 

public void setBounds(int x, int y, int w, int h) { 
    super.setBounds(x, 0, w, JTreeTable.this.getHeight()); 
} 

public void paint(Graphics g) { 
    g.translate(0, -visibleRow * getRowHeight()); 
    super.paint(g); 
} 

public Component getTableCellRendererComponent(JTable table, 
          Object value, 
          boolean isSelected, 
          boolean hasFocus, 
          int row, int column) { 
    if(isSelected) 
      setBackground(table.getSelectionBackground()); 
    else 
      setBackground(table.getBackground()); 

    visibleRow = row; 
    return this; 
    } 
} 

// 
// The editor used to interact with tree nodes, a JTree. 
// 

public class TreeTableCellEditor extends AbstractCellEditor implements TableCellEditor { 
    public Component getTableCellEditorComponent(JTable table, Object value, 
          boolean isSelected, int r, int c) { 
     return tree; 
    } 

    @Override 
    public Object getCellEditorValue() { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 

子を追加(または変更または削除)した後

答えて

2

モデルはあなたのデータを保持するクラスです。データが変更されるたびにビューが表示され、ビューが更新され、モデルの新しいデータが表示されるようにする必要があります。これはメソッドfireXxx()の目標です。

他のSwingコンポーネントと同様に、コンポーネントによって表示されるデータを変更するときは、モデル内のデータを変更して適切なfireXxxメソッドを呼び出す必要があります。データの変更を行うAbstractTreeTableModelのサブクラスに特定のメソッドを追加し、fireXxxへの1回または複数回の呼び出しを使用して適切なイベントを発生させることで、これをモデルクラスにカプセル化することをお勧めします。

tablesとかtreesについてのSwingチュートリアルを読んで、ここで学んだ内容をツリーテーブルに適用することをお勧めします。アイデアは同じです。

+0

パーフェクト...私はメカニズムを理解し始めます!ありがとう! – marco

+0

fireTreeNodesInsertedは、4つのパラメータを取る方法: ソース - I新しい要素 私の場合 - 新しい要素が挿入されているノード パス - ルートノードへの経路 childIndices - 新しい要素 子のインデックスをAという名前の父にA1という名前の子を追加しました。私はこれを私のモデルに追加した後、fireTreeNodesInserted()を呼び出さなければなりません...最初と最後のパラメータはそれぞれAとA1です...しかし、私はどのように2番目と3番目を埋めるのか分からない... – marco

+0

3番目の要素は、Aの子のリスト内のA1のインデックス(0から始まる)という1つの要素を含む配列でなければなりません。それがAの最初の子であれば、0を含むはずです.2番目の引数は、Aからルートへのパスです。したがって、最初の要素としてAを、Aの親などを最後のインデックスにルートノードまで含める必要があります。 DefaultTreeModel(getPathToRoot)には、そのためのユーティリティメソッドがあります。 –