2016-08-06 39 views
0

這可能是更多的設計選擇,我認爲「爲什麼要重新發明輪子」。有人可能已經要求這個了。 (我不想去任何第三方框架,因爲我的小項目,我已經使用Adam Bein的afterburner.fx)。我正在javafx中實現一個獨立的應用程序。我對以下MVC/MVP/MVVM非常感興趣。由於javafx允許我使用fxml分離UI,因此我通過fxml實現了大部分UI設計。但在那裏我遇到了一些問題。設計在javafx項目中保留輔助方法

我的結構

  • TradeView.fxml(我所有的UI設計放在這裏)
  • TradeController(我所有的UI事件處理(也有一些業務邏輯)到這裏)
  • Trade(實體類)

現在我在我的fxml中有一個JavaFX TableView。所有TableColumn s在fxml本身中定義。如果它是我實體類中的直接屬性,則我想要綁定到列的值通過PropertyValueFactory實現。

TableView<Trade> myTableView; 

如:

<TableColumn fx:id="tradeOidTableColumn" prefWidth="130.0" text="Trade Oid"> 
    <cellValueFactory><PropertyValueFactory property="oid"/></cellValueFactory> 
</TableColumn> 

但我想在一列,其中Commodity是另一個實體與我Trade實體的關係,以顯示商品名稱縮寫。所以我可以使用

myTradeEntity.commodity().commodityShortName(); 

得到值,它完美的作品。但你們知道我不能這樣做,雖然fxml。它不支持嵌套綁定。

不可能

<cellValueFactory><PropertyValueFactory property="commodity.commodityShortName"/></cellValueFactory> 

所以我不得不使用單元格值工廠。我定義了一個類CommodityCellValueFactory並綁定它。 如:

<TableColumn fx:id="commodityTableColumn" prefWidth="220.0" text="Commodity"> 
    <cellValueFactory><CommodityCellValueFactory /></cellValueFactory> 
</TableColumn> 

基本上我想擺脫的細胞工廠和細胞值的工廠,除非我需要一些格式化要對我的價值實現。因此,我認爲我可以在我的Trade實體創建一個名爲

String tempCommodityShortName; 
String getTempCommodityShortName() 
{ 
    return commodity.commodityShortName(); 
} 

屬性並綁定該到我的表列。但我有大約15到20個屬性。如果我在我的實體類中執行此操作,那麼會使用這些額外的幫助器方法臃腫,我不想這樣做。

我想有像TradeEntityHelper/TradeEntityBusiness/TradeEntityAdditions每個實體都在那裏我可以擁有所有的輔助方法和訪問它的實現代碼如下列一個輔助類的。

我的第一次嘗試,而不是課,我選擇一個接口(由於Java 8接口支持默認方式)

interface ITradeEntityHelper 
{ 
//all helper methods goes here 
} 

class TradeEntity implements ITradeEntityHelper 
{ 
//real entity methods goes here 
} 

我將接口綁定到我的TableViewTableView<ITradeEntityHelper>代替TableView<TradeEntity>糾正我,如果我想了一些愚蠢的

現在的問題是我怎麼得到我在我的ITradeEntityHelper接口TradeEntity參考,這樣我可以問

tradeEntity.Commodity().commodityShortName(). 

(或)這樣的

interface ITrade{} 
class Trade implements ITrade{} 
class TradeAdditions implements ITrade{} 

保留Additions類中的幫助器方法。

我也想爲我的Controller類實現相同的功能。

如:
Application應該有基本接口每個控制器類,我想有一些默認的Java Predicate S和java的8個Function已定義,並希望在控制器類resue。

class TradeController implements ITradeController, Initializable 
{ 
} 
+0

我不知道我完全理解你,但看看[默認的方法(https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html)。另外,請記住,在Java中,與C#相比,接口可以有靜態方法。 – Itai

+0

嘿,我知道接口中的默認方法和靜態方法。但我的問題是,如果我實現一個接口,並寫下如下的默認方法。爲了得到我感興趣的價值「commodityShortName」,我需要我的界面中的交易實體參考。所以我可以說tradeEntity.commodity()。commodityShortName()。 dat我缺乏。默認公共ExternalComment getCommodityShortName() \t { \t \t return tradeEntityForWhichINeedCommodityShortName.commodity()。commodityShortName(); \t} –

回答

0

您可以選擇通過使用Bindings.select多層次結構的值。這使您可以創建一個單一cellValueFactory類:

import java.util.Arrays; 
import javafx.beans.NamedArg; 
import javafx.beans.binding.Bindings; 
import javafx.beans.value.ObservableValue; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.util.Callback; 

public class NestedPropertyValueFactory<S, T> implements Callback<TableColumn.CellDataFeatures<S, T>, ObservableValue<T>> { 

    private final String[] steps; 
    private final PropertyValueFactory firstStepSelector; 

    /** 
    * @param property a string containing the names of the properties seperated 
    * by '.'. 
    */ 
    public NestedPropertyValueFactory(@NamedArg("property") String property) { 
     String[] properties = property.split("\\."); 
     firstStepSelector = new PropertyValueFactory<>(properties[0]); 
     this.steps = Arrays.copyOfRange(properties, 1, properties.length); 
    } 

    @Override 
    public ObservableValue<T> call(TableColumn.CellDataFeatures<S, T> param) { 
     // use PropertyValueFactory for first step and Bindings.select for 
     // additonal steps. 
     return Bindings.select(firstStepSelector.call(param), steps); 
    } 

} 

這個類可以用作FXML文件cellValueFactory

<cellValueFactory> 
    <NestedPropertyValueFactory property="commodity.commodityShortName"/> 
</cellValueFactory> 

請注意,如果任何中間步驟產生null,你會得到System.err警告。

而且這一類,你需要使用堅持的命名約定財產的方法,即對方法的名稱應該是在這種情況下commodityPropertycommodityShortNameProperty(或getCommoditygetCommodityShort在他們觀察不到)。

+0

謝謝fabian。讓我試着更新你。在我之間已經問過了,我還想將所有與特定實體有關的謂詞和我經常調用的一些便利方法移動到單獨的接口或另一個與我的實體類相等的類。任何想法?再次感謝上述答案。 –