2017-01-02 21 views
0

テーブルを作成してダイナミックな列と行を持つようにしたいので、データソースから値を取得するとすぐにバックグラウンドから各セルの値を更新したいこれは私がスイングで使ったsetValueAt()です。 基本的に私の列は固定されておらず、行も固定されていないので、モデルクラスを作成したくないので、テーブルビューを再作成してテーブルビューの行を更新したくないので、 javafxの新しいテーブルビュー。 the javadocが言うようにあなたが私の質問を理解していない場合場合は、JAVAFXのテーブルビューで各行の値を更新する方法

編集例のソースコードテーブルモデルはアイテムで保持しているプロパティを

import javafx.application.Application; 
import javafx.beans.property.ReadOnlyObjectWrapper; 
import javafx.collections.*; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.stage.Stage; 

import java.util.*; 

public class DynamicTableView extends Application { 

private static final int N_COLS = 5; 
private static final int N_ROWS = 1000; 

public void start(Stage stage) throws Exception { 
    TestDataGenerator dataGenerator = new TestDataGenerator(); 

    TableView<ObservableList<String>> tableView = new TableView<>(); 

    // add columns 
    List<String> columnNames = dataGenerator.getNext(N_COLS); 
    for (int i = 0; i < columnNames.size(); i++) { 
     final int finalIdx = i; 
     TableColumn<ObservableList<String>, String> column = new TableColumn<>(
       columnNames.get(i) 
     ); 
     column.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))); 
     tableView.getColumns().add(column); 
    } 

    // add data 
    for (int i = 0; i < N_ROWS; i++) { 
     tableView.getItems().add(
       FXCollections.observableArrayList(
         dataGenerator.getNext(N_COLS) 
       ) 
     ); 
    } 

    tableView.setPrefHeight(200); 

    Scene scene = new Scene(tableView); 
    stage.setScene(scene); 
    stage.show(); 
} 

public static void main(String[] args) { 
    launch(args); 
} 

private static class TestDataGenerator { 

    private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem.".split(" "); 

    private int curWord = 0; 

    List<String> getNext(int nWords) { 
     List<String> words = new ArrayList<>(); 

     for (int i = 0; i < nWords; i++) { 
      if (curWord == Integer.MAX_VALUE) { 
       curWord = 0; 
      } 

      words.add(LOREM[curWord % LOREM.length]); 
      curWord++; 
     } 

     return words; 
    } 
} 
} 

答えて

1

感謝をコメントしてください。次の操作を行うことができます:

table.getItems() 

(追加、削除、クリア...)。

私の例では、表の文字列があります。各列に表示される内容を選択するには、setValueFactory()を使用する必要があります。このようにして、各列は各値のレンダリング方法を知ります。

"Hi how are you?" 

そして、あなたはこのような4列を取得しようとしている:

hi | how | are | you? 

あなただけitetate各列以上とparam.getValueを分割cellValueFactoryを設定することができますが、あなたが、文字列があるとしましょう()と対応するインデックスを取得します。

EDIT:は)(あなたのchangeValueAtを追加しました:

public class DynamicTableView extends Application { 

private static final int N_COLS = 5; 
private static final int N_ROWS = 1000; 

public void start(Stage stage) throws Exception { 
    TestDataGenerator dataGenerator = new TestDataGenerator(); 

    TableView<ObservableList<String>> tableView = new TableView<>(); 

    // add columns 
    List<String> columnNames = dataGenerator.getNext(N_COLS); 
    for (int i = 0; i < N_COLS; i++) { 
     final int index = i; 
     TableColumn<ObservableList<String>, String> column = new TableColumn<>(columnNames.get(i)); 
     column.setCellValueFactory(cellData -> new ReadOnlyObjectWrapper<>((cellData.getValue().get(index)))); 
     tableView.getColumns().add(column); 
    } 

    // add data 
    for (int i = 0; i < N_ROWS; i++) { 
     tableView.getItems().add(FXCollections.observableArrayList(dataGenerator.getNext(N_COLS))); 
    } 

    tableView.setPrefHeight(200); 

    Scene scene = new Scene(tableView); 
    stage.setScene(scene); 
    stage.show(); 
    changeValueAt(0,0, "thisIsMyNewValue", tableView); 

} 

private static void changeValueAt(int row, int col, String value, TableView<ObservableList<String>> table){ 
    ObservableList newData = table.getItems().get(row); 
    newData.set(col, value); 
    table.getItems().set(row, newData); 

} 

public static void main(String[] args) { 
    launch(args); 

} 

private static class TestDataGenerator { 

    private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem." 
      .split(" "); 

    private int curWord = 0; 

    List<String> getNext(int nWords) { 
     List<String> words = new ArrayList<>(); 

     for (int i = 0; i < nWords; i++) { 
      if (curWord == Integer.MAX_VALUE) { 
       curWord = 0; 
      } 

      words.add(LOREM[curWord % LOREM.length]); 
      curWord++; 
     } 

     return words; 
    } 
} 

}

を重要なことはこれです:レンダラーが毎回発射される

private static void changeValueAt(int row, int col, String value, TableView<ObservableList<String>> table){ 
    ObservableList newData = table.getItems().get(row); 
    newData.set(col, value); 
    table.getItems().set(row, newData); 

}

プロパティが変更されます。私はあなたが変更したい行の要素にアクセスするだけで、列の要素にアクセスします。これを変更することにより、新しい値をレンダリングする列に変更が通知されます。テーブルビューに

EXPLANATION

ジェネリッククラスは、テーブルビューは(項目プロパティで)を保持ObservableListにジェネリック型のクラスを表します。このタイプは、そうすることによって、行のタイプと一致している:あなたはあなたのケースObservableListには、最初の行データを保持するオブジェクトを取得している

table.getItems().get(0) 

。なぜあなたtable.getItems(これは)です

ObservableList<ObservableList<String>> 

(あなたが提供される汎用タイプのObservableList)を返します。

各列をレンダリングするときに、TableViewジェネリック型と列データ型を指定してから、自分の持つ情報からセル値を取得する方法を実装するCellValueFactoryを提供する必要があります。

これらはすべて、通常のデータ型のようなもので、変更時にイベントを発生させるプロパティで動作します。そのため、私のメソッドが機能する理由は、プロパティを変更すると、このプロパティは変更されたイベントを発生させ、テーブルは再表示されます(簡単な説明)。ここのことは、この変更が伝播しないように、列を保持するリスト、列を保持するリストは通知されないということです。だから私はすでにそれを修正した後、私は再び同じ行を設定する理由です。

テーブルが通常のPOJOを保持し、対話するObservableListだけがitemsプロパティであるため、あなたの例は非常にまれであることを理解してください。

+0

答えてくれてありがとうしかし、これは私が解決策を探しながら、私のユースケースは、私はスイング –

+0

完全に精である、私は私はあなたが望む結果を得ると思いますgrabed一例に過ぎません私はそれを実装する必要があります理解することはできません可能であれば上記のコードを編集して私を表示することができます –

+0

Sorrryの 'のsetValueAt()'メソッドのように気にいらをしたい –

関連する問題