gpt4 book ai didi

java - 如何在 JavaFX 中将一个简单的双矩阵绘制到 TableView 中?

转载 作者:行者123 更新时间:2023-11-29 08:38:54 26 4
gpt4 key购买 nike

我想在 JavaFX 中创建一个简单的 TableView,其中我的数据是一个类似于 double[][] 矩阵的二维数组,但我不知道如何可以做到这一点,一些建议?

最佳答案

正如 Fabian 在评论中建议的那样:

  1. 将您的表定义为:

    TableView<double[]>
  2. 添加元素 double[][]数组作为表格的项目(从 double[][] 中提取元素并将它们添加到 ObservableList<double[]> 中)。

  3. 为您的表创建列,为每个列提供一个单元格值工厂。

    col.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue()[c]))

    哪里c是列索引。

  4. 如果您需要格式化单元格项,请同时提供 cell factory .

matrix

import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class MatrixTable extends Application {
private Random random = new Random(42);
private static final int N_COLS = 4;
private static final int N_ROWS = 100;
private static final int MAX_DATA_VALUE = 100;

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

@Override
public void start(Stage stage) {
ObservableList<double[]> data = generateData();

TableView<double[]> table = new TableView<>(data);
table.getColumns().setAll(createColumns());
table.setPrefSize(200, 250);

stage.setScene(new Scene(table));
stage.show();
}

private ObservableList<double[]> generateData() {
return FXCollections.observableArrayList(
IntStream.range(0, N_ROWS)
.mapToObj(r ->
IntStream.range(0, N_COLS)
.mapToDouble(c -> randomValue())
.toArray()
).collect(Collectors.toList())
);
}

private List<TableColumn<double[], Double>> createColumns() {
return IntStream.range(0, N_COLS)
.mapToObj(this::createColumn)
.collect(Collectors.toList());
}

private TableColumn<double[], Double> createColumn(int c) {
TableColumn<double[], Double> col = new TableColumn<>("C" + (c + 1));
col.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue()[c]));

return col;
}

private long randomValue() {
return Math.round(random.nextDouble() * MAX_DATA_VALUE * 100) / 100.0;
}
}

Can you explain me this line code?

col.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue()[c]))

来自javadoc :

The cell value factory needs to be set to specify how to populate all cells within a single TableColumn. A cell value factory is a Callback that provides a TableColumn.CellDataFeatures instance, and expects an ObservableValue to be returned.

所以它正在做的是定义一种从 double[] 中提取列数据的方法。该行的数据数组(由 param.getValue() 提供)。因为我们使用的是 ReadOnlyObjectWrapper围绕数据值,如果您使表格单元格可编辑(我在本示例中没有这样做),它不会将编辑后的值写回数组。包装器是将 double 据值转换为 ObservableValue 所必需的(根据单元工厂接口(interface)的要求)。

是的,我知道这很令人困惑,但这是为了让 TableView 能够有效地得到潜在数百万数据项的支持所付出的代价 virtualized controls .如果您不需要 TableView 的虚拟化功能和其他功能,您总是可以在 GridPane 中使用标签。相反。

关于java - 如何在 JavaFX 中将一个简单的双矩阵绘制到 TableView 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41771098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com