web-dev-qa-db-ja.com

列にデータを追加する簡単な方法

JavaFXTableViewの列に2つの別々のデータセットを挿入したいと思います。基本的に、文字列を含む2つのLinkedListがあり、1つのリストを1つの列に配置し、別のリストを2番目の列に配置したいと思います。

これを行う最も簡単な方法は何ですか?または、別のJavaFX要素がこれに適していますか?

これまでに見つけた解決策は、行に挿入されたコレクションに基づいているだけでした。これは私がやりたいことではありません。

5
tikend

データを再編成して、2つのプロパティを持つクラスを作成することを強くお勧めします。1つは最初のリストの要素で、もう1つは2番目のリストの対応する要素です。次に、そのクラスのオブジェクトのリストを作成すると、通常の場合になります。

例えば。あなたが持っているとしましょう

// your first list:
List<Integer> intList = ... ;
// your second list:
List<String> stringList = ... ;

次に、定義します

public class MyDataType {
    private final int intValue ;
    private final String stringValue ;
    public MyDataType(int intValue, String stringValue) {
        this.intValue = intValue ;
        this.stringValue = stringValue ;
    }
    public int getIntValue() {
        return intValue ;
    }
    public String getStringValue() {
        return stringValue ;
    }
}

今、あなたはすることができます

TableView<MyDataType> table = new TableView<>();
for (int i = 0; i < intList.size() && i < stringList.size(); i++) {
    table.getItems().add(new MyDataType(intList.get(i), stringList.get(i)));
}

通常の方法で列を定義します。

何らかの理由で実際にそのデータ変換を行うことができない場合は、テーブルのタイプを整数と見なすことができます。各行の値は2つのリストへのインデックスです。リストのサイズまでの値0, 1,...をテーブルに入力します。これは次のようになります。

import Java.util.Arrays;
import Java.util.List;

import javafx.application.Application;
import javafx.beans.property.ReadOnlyIntegerWrapper;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class TableViewByColumns extends Application {

    @Override
    public void start(Stage primaryStage) {
        List<Integer> intValues = Arrays.asList(1, 2, 3, 4, 5);
        List<String> stringValues = Arrays.asList("One", "Two", "Three", "Four", "Five");

        TableView<Integer> table = new TableView<>();
        for (int i = 0; i < intValues.size() && i < stringValues.size(); i++) {
            table.getItems().add(i);
        }

        TableColumn<Integer, Number> intColumn = new TableColumn<>("Value");
        intColumn.setCellValueFactory(cellData -> {
            Integer rowIndex = cellData.getValue();
            return new ReadOnlyIntegerWrapper(intValues.get(rowIndex));
        });

        TableColumn<Integer, String> nameColumn = new TableColumn<>("Name");
        nameColumn.setCellValueFactory(cellData -> {
            Integer rowIndex = cellData.getValue();
            return new ReadOnlyStringWrapper(stringValues.get(rowIndex));
        });

        table.getColumns().add(intColumn);
        table.getColumns().add(nameColumn);

        primaryStage.setScene(new Scene(new BorderPane(table), 600, 600));
        primaryStage.show();
    }

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

コレクションを取得し、それに基づいて列にデータを入力するためのソリューションと、コレクションが後で変更されたときにObservableListを使用してテーブルを自動的に更新するためのソリューションがあるように見えるJavaFXチュートリアルを見つけました。

http://code.makery.ch/library/javafx-8-tutorial/part2/

彼らのコードには2つの属性を持つオブジェクトのリストがあり、別々の列のオブジェクトの2つの変数にアクセスする代わりに、2つの別々のリストから描画するようにコードを変更する必要があります。

1
dbillz