2016-12-22 8 views
0

テーブルビューに数字を自動的に挿入しようとしています。JavaFX 8:自動的にTableViewの行に番号を付ける

私は同様の構造を持つ2つのテーブルを持っており、アイデアは、ボタンクリックでtableAからtableBに選択項目をコピーすることです。

合計列:3
RowCol =番号を表示することになって(Modelクラスから来る)を自動的
TestCol =テスト名(Modelクラスから来る)
ModCol =モジュール

私はこの出くわしましたtableAの自動番号付けを解決するための質問。
auto numbered table rows (javafx)

コード:これはにtableAのためにうまく機能していると私はテーブルBのために同じコードを使用しますが、私は次のような問題を取得し

tableARowCol.setCellValueFactory(cellData -> new ReadOnlyObjectWrapper<Number>(
      tableA.getItems().indexOf(cellData.getValue()) + 1)); 
tableATestCol.setCellValueFactory(cellData -> cellData.getValue().testCaseNameProperty()); 
tableAModCol.setCellValueFactory(cellData -> cellData.getValue().moduleNameProperty()); 

BTNクリックにデータを追加するとき(自動番号が正しく更新されていません):

画像において

、テーブルBの行数は、1,2,3,3,3,2,7として表示されています。
Iは、以下たときは、この出力された:

    にtableAから
  • 添加行1
  • 添加行2
  • にtableAから追加された行3再度にtableAから追加された行2
  • にtableA 3Xからの
  • は、私が問題とどのように私はそれを修正することができますように思わ知りたいにtableAから

を行10を追加しました。正直言って、自動ナンバリング行の行を完全に理解していません。

これまでに何が起こっているかの流れ:

  • 選択項目がにtableA
  • からボタンを追加クリックしてBに追加[>>]
  • は、項目を追加した観察可能なリスト(モデルに追加されます

      :)とXMLファイル

    言及する価値に保存

  • XMLから項目をロードして、それを表Bに移入するリスナーがもう1つあります。項目がXMLからロードされると、番号付けは正しいです。今回はXMLからロードされた同じデータです。通知tableB番号は正しいです。 This is the same data loaded from the XML this time. Notice tableB numberings are correct.

TABLEB行番号付けのためのコード:助けを事前に

tableBRowCol.setCellValueFactory(cellData -> new ReadOnlyObjectWrapper<Number>(
      tableB.getItems().indexOf(cellData.getValue()) + 1)); 
tableBTestCol.setCellValueFactory(cellData -> cellData.getValue().testCaseNameProperty()); 
tableBModCol.setCellValueFactory(cellData -> cellData.getValue().moduleNameProperty()); 

ありがとう!

+0

カスタム 'RowFactory'または' CellFactory'はありますか? – Itai

+0

こんにちは、あなたが習慣の意味を説明できますか?ありがとう!私が理解する限り、私は持っていません。 – iamkenos

答えて

1

tableAのアイテムリストを使用して、tableBのインデックスを決定しているという問題があります。

but:

このアプローチを使用しないでください!

私は多くのユーザーがあなたが使用した答えをupvoted知っていますが、いくつかの深刻な問題があります。 itemsのリストに複数のアイテムがあり、等しい(またはあなたの場合と同じ)場合は、インデックスは常にListにある最初のものになります。

代わりTableCellnitemsリストのサイズですO(n)の時間を実行している最悪のケースを持っているリスト内の項目のための非効率的な検索を取り除くであろう、提供indexプロパティを使用して...

public class NumberTableCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> { 

    private final int startNumber; 

    public NumberTableCellFactory(@NamedArg("startNumber") int startNumber) { 
     this.startNumber = startNumber; 
    } 

    public NumberTableCellFactory() { 
     this(1); 
    } 

    public static class NumberTableCell<S, T> extends TableCell<S, T> { 

     private final int startNumber; 

     public NumberTableCell(int startNumber) { 
      this.startNumber = startNumber; 
     } 



     @Override 
     public void updateItem(T item, boolean empty) { 
      super.updateItem(item, empty); 

      setText(empty ? "" : Integer.toString(startNumber + getIndex())); 
     } 

    } 

    @Override 
    public TableCell<S, T> call(TableColumn<S, T> param) { 
     return new NumberTableCell<>(startNumber); 
    } 

    public static <T> TableColumn<T, Void> createNumberColumn(String text, int startNumber) { 
     TableColumn<T, Void> column = new TableColumn<>(text); 
     column.setSortable(false); 
     column.setEditable(false); 
     column.setCellFactory(new NumberTableCellFactory<>(startNumber)); 
     return column; 
    } 

} 

これは、このように使用することができます:

tableA.getColumns().add(NumberTableCellFactory.createNumberColumn("#", 1)); 
tableB.getColumns().add(NumberTableCellFactory.createNumberColumn("#", 1)); 

以下は、@ jewelseaの答えに小さな変化であります

+0

本物の質問はこちらこれは、セルが再利用されたときに、* updateItem(...)メソッドが呼び出される前にインデックスが設定されていると仮定していますか? AFAIKインデックスは、 'updateIndex(...)'メソッドのデフォルト実装への呼び出しの一部として設定されます。 'updateItem(...)'と 'updateIndex(...)'の順序が文書化されているとは思わないので、 'updateItem(...)'の代わりに 'updateIndex(..)'をオーバーライドする方が安全かもしれないようです。 (...) '(または' indexProperty() 'へのバインディングを使用します)。 –

+0

@ fabianは正解としてこれを受け入れています。あなたのソリューションは機能しましたが、少し修正する必要がありました。 'tableA.setCellFactory(newTableCellFactory.createNumberColumn("# "、1));'テーブルに新しい列を追加するので、代わりに 'tableA.setCellFactory(new NumberTableCellFactory <>() ); 'お詫びしますが、評判が足りないのであなたの答えをアップアップすることはできません。 – iamkenos

関連する問題