我想在JavaFX TableView中向列中插入两个单独的数据集。基本上我有2个带有字符串的LinkedLists,我想把一个列表放在一列中,另一个列表放在第二列中。
最简单的方法是什么?或者是另一个更好的JavaFX元素?
到目前为止,我找到的解决方案只基于插入行的集合,这不是我想要做的。
答案 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让表随着集合的更改而自动更新。
他们的代码有一个包含两个属性的对象列表,您可能希望修改他们的代码以从两个单独的列表中绘制,而不是为单独的列访问其对象的两个变量。