【问题标题】:JavaFx use String with Double on table columnJavaFx 在表列上使用 String 和 Double
【发布时间】:2014-11-25 02:42:41
【问题描述】:

我有一个名为“Product”的类,具有双重属性“price”。我在表格视图中的表格列上显示它,但我想显示格式化的价格——“20.00 美元”而不是“20.00”。

这是我填充表格视图的代码:

priceProductColumn.setCellValueFactory(cellData -> cellData.getValue().priceProperty());

我尝试了一切:将返回的值转换为字符串,使用 priceProperty 具有的 toString 方法等,但似乎不起作用。

我需要绑定类似的事件吗?

【问题讨论】:

    标签: java javafx javafx-8


    【解决方案1】:

    使用cellValueFactory 来确定显示的数据。单元格值工厂基本上是一个函数,它接受一个 CellDataFeatures 对象并返回一个 ObservableValue 包装要在表格单元格中显示的值。您通常希望在 CellDataFeatures 对象上调用 getValue() 以获取该行的值,然后从中检索一个属性,就像您在发布的代码中所做的那样。

    使用cellFactory 来确定如何显示这些数据。 cellFactory 是一个函数,它接受 TableColumn(您通常不需要)并返回 TableCell 对象。通常,您会返回 TableCell 的子类,该子类会覆盖 updateItem() 方法,以根据单元格显示的新值设置单元格的文本(有时是图形)。在您的情况下,您获得的价格为Number,只需根据需要对其进行格式化并将格式化后的值传递给单元格的setText(...) 方法。

    值得阅读相关的 Javadocs:TableColumn.cellFactoryProperty()Cell,以了解有关单元和单元工厂的一般性讨论。

    priceProductColumn.setCellValueFactory(cellData -> cellData.getValue().priceProperty());
    
    priceProductColumn.setCellFactory(col -> 
        new TableCell<Product, Number>() {
            @Override 
            public void updateItem(Number price, boolean empty) {
                super.updateItem(price, empty);
                if (empty) {
                    setText(null);
                } else {
                    setText(String.format("US$%.2f", price.doubleValue()));
                }
            }
        });
    

    (我假设priceProductColumnTableColumn&lt;Product, Number&gt; 并且Product.priceProperty() 返回DoubleProperty。)

    【讨论】:

    • 谢谢!!你能解释一下代码吗?我还是 Java 初学者。
    • 基本上他所做的就是覆盖该列的原始cellFactor。然后,如果价格为空,则文本不应为任何内容,如果价格不为空,则列文本应为价格。字符串格式在价格前添加美元。在此处阅读有关字符串格式的更多信息:examples.javacodegeeks.com/core-java/lang/string/…
    • 更新了描述。
    【解决方案2】:

    如果您还没有,请与@James_D 帖子一起阅读。

    https://docs.oracle.com/javafx/2/ui_controls/table-view.htm

    【讨论】:

      猜你喜欢
      • 2016-08-26
      • 2021-02-21
      • 2021-01-27
      • 2013-06-20
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多