2015-08-15 60 views
3

我有以下类,其中包含价格,数量属性以及这两个属性中的任何更改都应导致事务处理费用的更新。javafx:将属性绑定在一起并在tableview中显示它们

public class GroceryCounter { 


    private DoubleProperty volume; 
    private DoubleProperty price; 
    private DoubleBinding transactionFee; 

    public double getVolume(){ 
     return this.volume.get(); 
    } 

    public DoubleProperty volumeProperty(){ 
     return this.volume; 
    } 

    public void setVolume(double volume){ 
     this.volume.set(volume); 
    } 


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

    public DoubleProperty priceProperty(){ 
     return this.price; 
    } 

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

    public double getTransactionFee(){ 
      this.transactionFee = this.price.multiply(this.volume).multiply(0.0025); 
      return this.transactionFee.getValue(); 
    } 

    public DoubleBinding transactionFeeProperty(){ 
     return this.transactionFee; 
    } 
} 

这是我在我的Controller类中使用的代码。

public TableColumn<Trade, Double> transactionFeeColumn; 
...... 

// in the initialize method 
transactionFeeColumn.setCellValueFactory(cellData -> cellData.getValue().transactionFeeProperty()); 

问题

  1. 我不能与下面的消息表列显示的交易手续费:

    类型不匹配:不能从DoubleBinding转换为ObservableValue

我觉得很舒服关于上面的代码安全,因为我觉得我应该使用getTransactionFee()而不是transactionFeeProperty()在tableColumn中显示结果。

  1. 我是否正确地将价格属性和音量属性绑定到transactionFee

谢谢。

回答

1

变化:

public TableColumn<Trade, Double> transactionFeeColumn; 

到:

public TableColumn<GroceryCounter, Number> transactionFeeColumn; 

为什么?因为: DoubleBinding类实现了ObservableValue<Number>接口。

模型类应该看起来像下面这样:

public class GroceryCounter { 

    private final DoubleProperty volume = new SimpleDoubleProperty(); 
    private final DoubleProperty price = new SimpleDoubleProperty(); 
    private final DoubleBinding transactionFee; 

    public GroceryCounter() { 
     this.transactionFee = this.price.multiply(this.volume).multiply(0.0025); 
    } 



    public double getVolume() { 
     return this.volume.get(); 
    } 

    public DoubleProperty volumeProperty() { 
     return this.volume; 
    } 

    public void setVolume(double volume) { 
     this.volume.set(volume); 
    } 

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

    public DoubleProperty priceProperty() { 
     return this.price; 
    } 

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

    public double getTransactionFee() { 

      return this.transactionFee.getValue(); 
    } 

    public DoubleBinding transactionFeeProperty() { 
     return this.transactionFee; 
    } 
} 

更新:

下面是一个例子:

public class Main extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     TableColumn<GroceryCounter, Number> TransCol = new TableColumn("transactionFee"); 
     TransCol.setCellValueFactory(cellData -> cellData.getValue().transactionFeeProperty()); 
     TableColumn<GroceryCounter, Number> priceCol = new TableColumn("price"); 
     priceCol.setCellValueFactory(cellData -> cellData.getValue().priceProperty()); 
     TableColumn<GroceryCounter, Number> volumeCol = new TableColumn("volume"); 
     volumeCol.setCellValueFactory(cellData -> cellData.getValue().volumeProperty()); 
     GroceryCounter item = new GroceryCounter(); 
     item.setPrice(10); 
     item.setVolume(10); 
     TableView<GroceryCounter> table = new TableView(); 
     table.getColumns().addAll(volumeCol, priceCol, TransCol); 
     table.getItems().add(item); 
     AnchorPane root = new AnchorPane(); 
     root.getChildren().add(table); 
     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String... args) { 
     Application.launch(args); 
    } 
} 
+0

但是,你怎么能扳平'getTransactionFee()'实例方法到Controller中的TableColumn? – mynameisJEFF

+0

@mynameisJEFF我更新了我的答案。 – Kachna

相关问题