当前位置: 首页 > 知识库问答 >
问题:

Javafx:如何用地图填充TableView?

蒋畅
2023-03-14

我无法用地图填充TableView

我有一个类,它拥有一个以产品名称为键、以正常价格为值的地图。我创建了一个tableView,其中一列是名称,一个主列是价格,分为两列normal和new,如下所示。

public class CreatePricesPane extends GridPane {
    private TableView table = new TableView<>();
    private PriceList tempPriceList;


    public CreatePricesPane(){
        this.tempPriceList = Controller.getController().createPriceList();
        this.setPadding(new Insets(20));
        this.setHgap(70);
        this.setVgap(10);
        this.setGridLinesVisible(false);
//        this.setPrefSize(800, 500);
        this.setStyle("-fx-background-color: #fff");

        //All about table
        this.table.setEditable(true);
        this.table.setItems(this.generateData());
        TableColumn<Map,String> nameColumn = new TableColumn("Names");
        nameColumn.setMinWidth(300);

        TableColumn pricesColumn = new TableColumn("Prices");

        TableColumn<Map,Double> normalPriceColumn = new TableColumn("Normal price");
        normalPriceColumn.setMinWidth(150);
//        normalPriceColumn.setCellValueFactory(new MapValueFactory<>());

        TableColumn newPriceColumn = new TableColumn("New price");
        newPriceColumn.setMinWidth(150);

        pricesColumn.getColumns().addAll(normalPriceColumn,newPriceColumn);


        table.setEditable(true);
        table.getSelectionModel().setCellSelectionEnabled(true);
        table.getColumns().setAll(nameColumn, pricesColumn);

我已经做了这个方法使地图成为一个可观察列表。

    private ObservableList<Map<String, Double>> generateData(){
        ObservableList<Map<String,Double>> alldata = FXCollections.observableArrayList();

        Map<String, Double> map = new HashMap(this.tempPriceList.getPriceListMap());

        for (Map.Entry<String, Double> entry : map.entrySet()) {
            Map<String, Double> dataRow = new HashMap<>();
            dataRow.put(entry.getKey(), entry.getValue());
            alldata.add(dataRow);
        }
        return alldata;
    }

这就是我卡住的地方。我不知道如何用这个可观察列表填充每个单元格。我确实知道我必须以某种方式使用“setCellFactory”。有人有什么建议吗?如何制作最后一段代码?或者把我送到正确的方向?

提前感谢!

这是我迄今为止一直在尝试的。但实际上,我很难理解下面这段代码中发生了什么。我希望它能在开始时用名字填充表格。不走运。

        Callback<TableColumn<Map, String>, TableCell<Map, String>>
                cellFactoryForMap = new Callback<TableColumn<Map, String>,
                TableCell<Map, String>>() {
            @Override
            public TableCell call(TableColumn p) {
                return new TextFieldTableCell(new StringConverter() {
                    @Override
                    public String toString(Object t) {
                        return t.toString();
                    }
                    @Override
                    public Object fromString(String string) {
                        return string;
                    }
                });
            }
        };

nameColumn.setCellFactory(cellFactoryForMap);

共有1个答案

胡博艺
2023-03-14

为TableView项目创建一个真正的数据类型。

public class Item {
    private final StringProperty name;
    private final DoubleProperty price;
    private final DoubleProperty newPrice;

    public Item() {
        name = new SimpleStringProperty(this, "name");
        price = new SimpleDoubleProperty(this, "price");
        newPrice = new SimpleDoubleProperty(this, "newPrice");
    }

    public Item(String name,
                double price) {
        this();
        setName(name);
        setPrice(price);
    }

    public StringProperty nameProperty() {
        return name;
    }

    public String getName() {
        return name.get();
    }

    public void setName(String name) {
        this.name.set(name);
    }

    public DoubleProperty priceProperty() {
        return price;
    }

    public double getPrice() {
        return price.get();
    }

    public void setPrice(double price) {
        this.price.set(price);
    }

    public DoubleProperty newPriceProperty() {
        return newPrice;
    }

    public double getNewPrice() {
        return newPrice.get();
    }

    public void setNewPrice(double price) {
        this.newPrice.set(price);
    }
}

(注意:在现实世界的应用程序中,程序员永远不应该使用double来表示货币金额,因为float和double是不精确的数字,可能会丢失信息。BigDecimal是表示货币的正确类型。)

现在,TableColumns的单元格值工厂变得简单多了:

nameColumn.setCellValueFactory(f -> f.getValue().nameProperty());
pricesColumn.setCellValueFactory(f -> f.getValue().priceProperty());
newPriceColumn.setCellValueFactory(f -> f.getValue().newPriceProperty());

创建这些项目与您已经在做的事情非常相似,尽管更简单:

private ObservableList<Item> generateData() {
    ObservableList<Item> alldata = FXCollections.observableArrayList();

    for (Map.Entry<String, Double> entry : map.entrySet()) {
        alldata.add(new Item(entry.getKey(), entry.getValue()));
    }

    return alldata;
}
 类似资料:
  • 我想知道是否可以使用来填充?我使用了而不是,因为我需要经常添加和删除,所以我需要最小化成本。 我的hashMap使用一个大整数作为键字段,一个具有许多属性的类型作为值字段。在我的tableView中,我只想显示每个属性都有一列的值。我希望你说清楚了 谢谢

  • 我的Java程序产生了很多数据,我用它构建了单个的ResultObject。因为只有某些结果对象会引起兴趣,所以我填充了一个可观察的HashMap 虽然映射和处理这些结果按预期工作,但我很难用该ObservableHashMap填充TableView 我的CustomObject(如果两个CustomObject具有相同的属性,只需检查JSONObject): 我的ObservableHashMa

  • 如何在FXML中定义表,然后使用JavaFX代码在运行时动态填充表?

  • 因此,我试图在我的JavaFX应用程序中创建一个自定义节点,它从扩展而来,因此可以自己进行渲染。我一开始只是试着画一个文本“Hello world”在画布上,但可惜它没有出现,即使我可以通过鼠标事件处理程序确认应用程序中是否存在自定义节点。 简而言之,如果我将这个的一个新实例添加到一个

  • 我在tableview中使用的一列有问题<本栏最初用于显示我拥有的一种数据类型: 我想更改此列中显示的数据,因此我更改了FXML文件中的列名,并编写了以下内容: 我的ResearchData类编码如下: (我只保留了rang、luse和lSysteme,但我有很多其他变量都是这样写的)。 当我启动程序时,在tableview中,除Systeme列外,所有列都正确显示,我收到了以下错误消息: 我可以

  • 我在互联网上找不到正确的答案,如何用ObservableMap作为MapProperty填充tableviw。我想在按值排序的tableview中显示文章。