2015-08-15 63 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

相關問題