2017-05-28 15 views
0

JTreeTableを構築しています。私はいくつかの初心者コードを見つけ、かなり遠くに来ました。最終的に私の目標は、階層的なリストのように異なるレベルで異なるデータを持つことができるようにすることです。JTreeTableの動的列

現在、私はさまざまなレベルでデータを扱っています。しかし、私は次の目標として列を変更することになると壁に向かって走っています。私は現在、私は3より、マイルストーン持って立ってどこから:

  • 異なるレベルの列の異なるセットを表示するさまざまなレベル
  • の列の幅を調整する能力テーブルのJTreeの部分が常に左にとどまることを確認私はこのタスクを手仕舞いに近いが、再びJTreeTableが複雑で作成するので、これらの3

    の最初で立ち往生しています

、ミニム

enter image description here

が、私はこれらのクラスのいずれかにコードを投稿して幸せですが、私も役に立たないコードとの質問を詰まらせたくありませんでした:ええと例では、画像内に以下に挙げるいくつかのクラスを利用しています。まず、私が望む機能を見せてください。

第1の画像は、最上位が選択され、第2の画像が第2のレベルが選択されたときである。どのように列が異なるかに注目してください。それが私のアプリケーションで起こりたいことです。

トップレベル選択:

JTreeTable-TopLevelSelected

をセカンドレベルが選択:リストの選択があるとき

JTreeTable-SecondLevelSelected

だから私はこの問題を解決しようとした一つの方法は、ありますこのコードセクション内で変更されました:

ListSelectionListener listener = (ListSelectionEvent e) -> { 
     TreeTableModelAdapter adapter = (TreeTableModelAdapter) JTreeTable.this.getModel(); 
     //Need to see why this breaks. 
     JTreeTable.this.getTableHeader().setColumnModel(adapter.getColumnModel()); 
    }; 
    this.getSelectionModel().addListSelectionListener(listener); 

このコードはJTreeTableの初期化中です。私はTableHeaderとテーブルの両方で列モデルを設定しようとしました。以下は、私が行を選択すると、次に何が起こるかです:

JTreeTable-ColumnModelUpdated

列がちょうど私に消えます。任意の方向は非常に参考になる

public TableColumnModel getColumnModel(){ 
    DefaultTableColumnModel model = new DefaultTableColumnModel(); 
    for(int i=0;i<getColumnCount();i++){ 
     TableColumn column = new TableColumn(); 
     column.setIdentifier(getColumnName(i)); 
     model.addColumn(column); 
    } 
    return model; 
} 

:列モデルの作成は、以下の方法でTreeTableModelAdapterクラスで起こっています。もう一度、質問に答えるのに役立つと思われるコードを投稿してください。コメントを入れてすぐに追加します。

答えて

0

他人に役立つ場合には、私が見つけたマイルストーンを追加しますが、今のところこの質問に答えています。

マイルストーン1

私は実際には最初のマイルストーンを解決することができました。キーは、新しい列モデルを作成するのではなく、列モデルの列の作成をトリガーすることです。

//Change columns depending on row 
ListSelectionListener listener = (ListSelectionEvent e) -> { 
    createDefaultColumnsFromModel(); 
}; 
this.getSelectionModel().addListSelectionListener(listener); 

このコードはJTreeTableJTree一部に選択された行に基づいて、列を作成する:下の行の選択が変更されたときのコードです。 TreeTableModelAdapterは、JTreeの選択された行をJTreeTableModelに渡すことによってgetColumnCount()getColumnName()のメソッドを実装し、JTreeの特定のノードに基づいて列とその名前が動的に取得されるようにします。私のための鍵は、JTreeTableを更新するために再び呼び出される人を引き起こしました。はるかに難しい私は当初の予想していたよりもあることが証明されたデータのレベルに基づいて、列幅を調整

マイルストーン2

。列のモデルが変わったときにセルの状態を保持するために、私はセルのペイントを切断する必要がありました。これは毛深いプロセスです。これはBasicTableUIの内部で行われ、セルの矩形を取得するメソッドはprivateです。そこでサブクラス化し、paint()メソッドをオーバーロードし、paintメソッドの中で呼び出される独自のメソッドを作成しなければなりませんでした。私は通常は私的な方法と呼ぶことができるようにコピー貼り付けがたくさんありました。私はちょうど彼らの名前を変更し、代わりにこれらのメソッドを参照しました。 UIクラスが設計された方法は、それを非常に柔軟にしませんでした。下の2つの画像は、私が異なるレベルを選択しているところであり、列は明らかに異なるレベルの幅です。

TopLevel

SecondLevel

マイルストーン3

私は、モデル内のビューを追跡することによって、この作品を作ることができました。これは、モデルがビューから切り離されているので、私にとっては非常に汚いようです。ツリーの列のクラスは一意であるため、その列がビューの最初のものであれば正しいクラスを返しただけです。

私がこのテクニックで持っている1つの問題は、返される値が一貫していない予期しない動作が発生することです。私はJTree.covertValueToText()を無効にしてこの問題を解決しようとしました。 JTreeは1つの値しか期待していないため、ビューの列の順序によってはこの値が変わる可能性があります。したがって、このメソッドをオーバーライドするには、JTree列の値のストアドインデックスをチェックします。この場合も、予期しない動作が発生します。修正を見つけたら、私はその投稿を更新します。