這可能是更多的設計選擇,我認爲「爲什麼要重新發明輪子」。有人可能已經要求這個了。 (我不想去任何第三方框架,因爲我的小項目,我已經使用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
}
我將接口綁定到我的TableView
。 TableView<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
{
}
我不知道我完全理解你,但看看[默認的方法(https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html)。另外,請記住,在Java中,與C#相比,接口可以有靜態方法。 – Itai
嘿,我知道接口中的默認方法和靜態方法。但我的問題是,如果我實現一個接口,並寫下如下的默認方法。爲了得到我感興趣的價值「commodityShortName」,我需要我的界面中的交易實體參考。所以我可以說tradeEntity.commodity()。commodityShortName()。 dat我缺乏。默認公共ExternalComment getCommodityShortName() \t { \t \t return tradeEntityForWhichINeedCommodityShortName.commodity()。commodityShortName(); \t} –