我正在尝试从 Swing 切换到 JavaFX,但 TableView 出现问题。
我在内存中有一个基于列的通用数据结构,例如List<DataColumn> dataColumns = new ArrayList<DataColumn>();
where DataColumn
是一个表列,它是基元数组的包装器。为了JTable
我已经实现了一个自定义 TableModel 来处理这个数据结构。
我在 TableView 中看到的所有内容都是基于行列表而不是列。
如何使用 TableView 可视化此类数据而不将其复制到基于行的数据结构中?谢谢。
这是一个非常简单的示例,使用基于列的数据;也许这足以让你继续下去。本例的基本思想是使表类型Integer
,因此每列的值是由工厂计算的,该工厂仅将索引映射到DataColumn
结构,并检索索引的相应值。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javafx.application.Application;
import javafx.beans.property.ReadOnlyIntegerWrapper;
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 ColumnBasedTable extends Application {
@Override
public void start(Stage primaryStage) {
final int numRows = 20 ;
final int numCols = 12 ;
List<DataColumn<Integer>> data = new ArrayList<>();
for (int colIndex = 1; colIndex <= numCols; colIndex++) {
Integer[] colData = new Integer[numRows];
for (int rowIndex = 0; rowIndex < numRows; rowIndex++) {
colData[rowIndex] = (rowIndex+1)*colIndex ;
}
DataColumn<Integer> dataColumn = new DataColumn<>(colData);
data.add(dataColumn);
}
TableView<Integer> table = new TableView<>();
for (int i=0; i<numRows; i++) {
table.getItems().add(i);
}
for (int i=0; i<numCols; i++) {
TableColumn<Integer, Number> col = new TableColumn<>(Integer.toString(i+1));
final int colIndex = i ;
col.setCellValueFactory(cellData -> {
int rowIndex = cellData.getValue();
DataColumn<Integer> dataColumn = data.get(colIndex);
return new ReadOnlyIntegerWrapper(dataColumn.getData(rowIndex));
});
table.getColumns().add(col);
}
primaryStage.setScene(new Scene(new BorderPane(table), 600, 400));
primaryStage.show();
}
public static class DataColumn<T> {
private final T[] data ;
public DataColumn(T[] data) {
this.data = Arrays.copyOf(data, data.length);
}
public T getData(int index) {
return data[index];
}
public int getSize() {
return data.length ;
}
}
public static void main(String[] args) {
launch(args);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)