簡體   English   中英

JavaFX:使TableColumn觀察具有提取器功能的格式化Double

[英]JavaFX: Make TableColumn observe formatted Double with extractor functionality

我有一個由自定義對象FermentableInRecipeObservableList填充的TableView ,其中TableColumn之一定義為處理Number ,並且應將值顯示為百分比。

自定義對象由此類定義:

public class FermentableInRecipe extends Fermentable {

    private DoubleProperty percentage = new SimpleDoubleProperty();

    ...

    public Double getPercentage() {
        return this.percentage.getValue();
    }

    public void setPercentage(Double value) {
        if (value == null || value.isNaN() || value.isInfinite() || value > 1.0 || value < 0.0) {
            this.percentage.setValue(0.0);
        } else {
            this.percentage.setValue(value);
        }
    }

    public DoubleProperty percentageProperty() {
        if (percentage == null) {
            percentage = new SimpleDoubleProperty(0.0);
        }
        return percentage;
    }
}

在我的控制器中是帶有子TableColumnTableView對象。

@FXML
private TableView<FermentableInRecipe> tableviewFermentablesInRecipe;
@FXML
private TableColumn<FermentableInRecipe, Number> columnRecipeFermentablePercentage;

TableView由我的自定義對象的以下ObservableList填充,該對象已用提取程序實例化。

private ObservableList<FermentableInRecipe> fermentablesInRecipe 
        = FXCollections.observableArrayList(item -> new Observable[]{
            item.WeightProperty(), 
            item.isLateAdd(), 
            item.isBulkBought()
        });

tableviewFermentablesInRecipe.setItems(fermentablesInRecipe);

通過以下對setCellValueFactory()setCellFactory()方法的使用(我基於先前的問題之一 ),我得到了要顯示的值。 但是,無論何時編輯ObservableList的元素,它都不會更新(就像它忽略了我的提取器一樣)。 當我直接在自定義對象中觀察SimpleDoubleProperty時,不會發生此行為(但是它將是未格式化的Double )。

    final JavaBeanDoublePropertyBuilder percentageCellBuilder
            = JavaBeanDoublePropertyBuilder
                    .create()
                    .beanClass(FermentableInRecipe.class)
                    .name("percentage");

    columnRecipeFermentablePercentage.setCellValueFactory(item -> {
        try {
            return percentageCellBuilder.bean(item.getValue()).build();
        } catch (NoSuchMethodException ex) {
            Logger.getLogger(MasterController.class.getName())
                    .log(Level.SEVERE, null, ex);
            return null;
        }
    });

    columnRecipeFermentablePercentage.setCellFactory(item -> 
            new PercentageCell<>()
    );

這是百分比單元格類:

public class PercentageCell<T> extends TableCell<T, Number> {

    NumberFormat percentageFormat = NumberFormat.getPercentInstance();

    @Override
    protected void updateItem(Number percentage, boolean empty) {
        super.updateItem(percentage, empty);

        if (percentage == null || empty) {
            setText(null);
            setStyle("");
        } else {
            setText(percentageFormat.format(percentage));
            setStyle("-fx-alignment: CENTER;");
        }
    }
}

因此,問題是...如何獲取TableColumn以顯示格式化的數字,同時仍然使提取器功能正常?

抱歉,如果該帖子太大,但是我不想遺漏任何內容。

正如@James_D指出的那樣,我正在不必要地使用JavaBeanDoubleProperty因為我的自定義對象已經具有一個我可以利用的DoubleProperty

為了解決這個愚蠢的錯誤,我更改了此...

final JavaBeanDoublePropertyBuilder percentageCellBuilder
        = JavaBeanDoublePropertyBuilder
                .create()
                .beanClass(FermentableInRecipe.class)
                .name("percentage");

columnRecipeFermentablePercentage.setCellValueFactory(item -> {
    try {
        return percentageCellBuilder.bean(item.getValue()).build();
    } catch (NoSuchMethodException ex) {
        Logger.getLogger(MasterController.class.getName())
                .log(Level.SEVERE, null, ex);
        return null;
    }
}); 

...到這個...

columnRecipeFermentablePercentage.setCellValueFactory(item -> 
                                item.getValue().percentageProperty()
);

現在,通過我的提取器自動更新TableView內容的工作完全符合預期。 傻我

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM