将数据添加到列的简单方法

时间:2015-07-09 13:19:09

标签: java javafx tableview

我想在JavaFX TableView中向列中插入两个单独的数据集。基本上我有2个带有字符串的LinkedLists,我想把一个列表放在一列中,另一个列表放在第二列中。

最简单的方法是什么?或者是另一个更好的JavaFX元素?

到目前为止,我找到的解决方案只基于插入行的集合,这不是我想要做的。

2 个答案:

答案 0 :(得分:9)

我强烈建议您重新组织数据,以便拥有一个包含两个属性的类,其中一个是第一个列表中的元素,另一个是第二个列表中的相应元素。然后你可以列出该类的对象列表,并且你可以简化为通常情况。

E.g。假设你有

// 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)));
}

并以通常的方式定义列。

如果由于某种原因确实无法进行数据转换,那么您可以将表的类型视为整数,每行的值是两个列表的索引。使用值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);
    }
}

答案 1 :(得分:1)

我找到了一个JavaFX教程,似乎有基于它们的集合和填充列的解决方案,以及使用ObservableList让表随着集合的更改而自动更新。

Properties

他们的代码有一个包含两个属性的对象列表,您可能希望修改他们的代码以从两个单独的列表中绘制,而不是为单独的列访问其对象的两个变量。