2015-01-19 1 views
0

У меня был Tableview, который я пытаюсь преобразовать в TreeTableView. Получение этого населенного пункта не становится легким для меня. Вот соответствующий код. Как мы заполнить столбец TreeTable и мы можем динамически заполнить TreeItemПолучение работы TreeTableView

От FXMLFile

<TreeTableView fx:id="openPositionsfx" prefHeight="200.0" prefWidth="900.0"> 
    <columns> 
      <TreeTableColumn fx:id="symbolfx2" prefWidth="75.0" text="Symbol" /> 
      <TreeTableColumn fx:id="expirydatefx2" prefWidth="75.0" text="Expiry Date" /> 
      <TreeTableColumn fx:id="tradedatefx2" prefWidth="75.0" text="Trade Date" /> 
      <TreeTableColumn fx:id="buysellfx2" prefWidth="60.0" text="Buy/Sell" /> 
      <TreeTableColumn fx:id="quantityfx2" prefWidth="65.0" text="Quantity" /> 
      <TreeTableColumn fx:id="buysellPricefx2" prefWidth="65.0" text="Price" /> 
     <TreeTableColumn fx:id="mktpricefx2" prefWidth="70.0" text="Mkt Price" /> 
     <TreeTableColumn fx:id="daysopenfx2" prefWidth="70.0" text="Days Open" /> 
     <TreeTableColumn fx:id="unrealizedfx2" prefWidth="90.0" text="Unrealized PnL" /> 

    </columns> 
</TreeTableView> 

код с контроллера

@FXML 
private TreeTableColumn<OpenPositions, Date> expirydatefx2; 
@FXML 
private TreeTableColumn<OpenPositions, Date> tradedatefx2; 
@FXML 
private TreeTableColumn<OpenPositions, String> buysellfx2; 
@FXML 
private TreeTableColumn<OpenPositions, Integer> quantityfx2; 
@FXML 
private TreeTableColumn<OpenPositions, Double> buysellPricefx2; 
@FXML 
private TreeTableColumn<OpenPositions, String> optiontypefx2; 
@FXML 
    private TreeTableColumn<OpenPositions, Double> mktpricefx2; 
@FXML 
private TreeTableColumn<OpenPositions, Integer> daysopenfx2; 
@FXML 
private TreeTableColumn<OpenPositions, String> unrealizedfx2; 
private TreeTableView<OpenPositions> openPositionsfx; 

FormattedData FD = new FormattedData(); 
private ObservableList<OpenPositions> openPositionsdata; 

    @Override 
public void initialize(URL url, ResourceBundle rb) { 
    fetchOpenPositions(openPositionsfx); 
} 

private void fetchOpenPositions(TreeTableView treetableView) { 

    //Is this correct? Since I didnt define this in FXML. Scenebuilder does not have TreeItem and hence cant define in FXML file 
    final TreeItem<String> FuturesNode = new TreeItem<>("Futures"); 
    final TreeItem<String> OptionsNode = new TreeItem<>("Options"); 
    final TreeItem<String> root = new TreeItem<>("NSE F&O"); 
    treetableView = new TreeTableView<>(root); 
    root.setExpanded(true); 
    root.getChildren().setAll(FuturesNode, OptionsNode); 



    openPositionsdata = FXCollections.observableArrayList(); 
    DBConnection DBcon = new DBConnection(); 

    try { 

     Connection con = DBcon.getConnection(); 


     String sqlstring = null; 
     Statement st = con.createStatement(); 

     sqlstring = " SELECT SYMBOL,EXPIRY_DATE, TRADE_DATE, \n" 
       + " BUYSELL, QUANTITY,BUYSELLPRICE,MARKET_PRICE,UNREALISED_PNL,DAYS_OPEN 
       + " FROM TB_POSITIONS\n" 
       + "WHERE EXPIRY_DATE>'01-JAN-2015'\n" 
       + "ORDER BY EXPIRY_DATE,SYMBOL,TRADE_DATE"; 

     ResultSet rs = st.executeQuery(sqlstring); 

     while (rs.next()) { 
      String symbol = rs.getString("SYMBOL"); 
      Date expiryDate = rs.getDate("EXPIRY_DATE"); 
      Double strike_price = rs.getDouble("STRIKE_PRICE"); 
      Date tradeDate = rs.getDate("TRADE_DATE"); 
      String buysell = rs.getString("BUYSELL"); 
      Integer quantity = rs.getInt("quantity"); 
      Double buysellprice = rs.getDouble("BUYSELLPRICE"); 
      Double closePrice = rs.getDouble("MARKET_PRICE"); 
      Double unrealisedPnl = rs.getDouble("UNREALISED_PNL"); 
      Integer daysOpen = rs.getInt("DAYS_OPEN"); 


      openPositionsdata.add(new OpenPositions(symbol, expiryDate, tradeDate, buysell, quantity, buysellprice, closePrice, 
        unrealisedPnlStr, daysOpen)); 

     } 

     //Does not work 
     symbolfx2.setCellValueFactory(new Callback<CellDataFeatures<OpenPositions,String>,ObservableValue<String>>(){ 
     public ObservableValue<String> call(CellDataFeatures<OpenPositions, String> p) { 
     return p.getValue().symbol; 
     } 
     }); 

     //Does not work 

     symbolfx2.setCellValueFactory(param -> param.getValue().getValue().getSymbol()); 

     //Works if it is tableview 

      expirydatefx2.setCellValueFactory(new PropertyValueFactory<>("expiryDate")); 

      treetableView.getColumns().setAll(openPositionsdata); 
     treetableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 

     rs.close(); 
     con.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

OpenPostions.java

public class OpenPositions { 

String symbol; 
Date expiryDate; 
Date tradeDate; 
String buysell; 
int quantity; 
Double buysellprice; 
Double marketPrice; 
String unrealisedPnl; 
Integer daysOpen; 


public OpenPositions(String symbol, Date expiryDate, Date tradeDate, String buysell, int quantity, Double buysellprice, 
     Double marketPrice, String unrealisedPnl,Integer daysOpen ) { 
    this.symbol = symbol; 
    this.tradeDate = tradeDate; 
    this.expiryDate = expiryDate; 
    this.buysell = buysell; 
    this.quantity = quantity; 
    this.buysellprice = buysellprice; 
    this.marketPrice=marketPrice; 
    this.unrealisedPnl=unrealisedPnl; 
    this.daysOpen=daysOpen; 
    this.optionType=optionType; 
    this.strikePrice=strikePrice; 
    this.pctpnl=pctpnl; 
    this.currentRate=currentRate; 
    this.todayspnl=todayspnl; 
    this.todaypctpnl=todaypctpnl; 


} 



public String getSymbol() { 
    return symbol; 
} 

public void setSymbol(String symbol) { 
    this.symbol = symbol; 
} 

ответ

0

В вашем методе fetchOpenPositions(...) , вы повторно назначаете новый параметр TreeTableView параметру (d, то не делайте с ним ничего с точки зрения размещения в графе сцены). Таким образом, любая дополнительная конфигурация находится на этом новом TreeTableView, а не на том, который был создан файлом FXML.

Просто замените

treetableView = new TreeTableView<>(root); 

с

treetableView.setRoot(root); 

Кроме того, ваши реализации фабричного значения ячеек выглядят, как они возвращаются в String, вместо ObservableValue<String>. Если OpenPositions класс определяет метод доступа к свойствам (рекомендуемый подход):

public StringProperty valueProperty() { ... } 

затем

symbolfx2.setCellValueFactory(param -> param.getValue().symbolProperty()); 

должен работать. В противном случае вам понадобится

symbolfx2.setCellValueFactory(param -> new ReadOnlyStringWrapper(param.getValue().getSymbol())); 
+0

Спасибо Джеймсу. В основном я не могу скомпилировать это Ошибка, которую я получаю: F: \ MyProjects \ MarketAnalytics \ src \ marketanalytics \ PnlSummaryController.java: 152: ошибка: несовместимые типы: строка не может быть преобразована в ObservableValue return p.getValue() .символ; java: 150: error: несовместимые типы: <анонимный обратный вызов , ObservableValue >> не может быть преобразован в обратный вызов , ObservableValue > – jay

+0

См. Правки. Также похоже, что вы импортировали неправильный класс CellDataFeatures ('TableColumn.CellDataFeatures' вместо' TreeTableColumn.CellDataFeatures'), но вы должны иметь возможность использовать код, который я показал в любом случае, и позволить компилятору вывести типы. Если это не сработает, обновите свой вопрос, чтобы показать класс 'OpenPositions'. –

+0

Продвинулся немного сегодня, но моя неопытность в java появляется. Я добавил вопрос OpenPositions.java. Только методы getter и setter в этом классе. Попробовали с вариациями кода и, наконец, это когда-то компилируется и запускается. Однако treetableview все еще показывает пустое. symolfx2.setCellValueFactory (новый TreeItemPropertyValueFactory <> ("символ")); treetableView.getColumns(). SetAll (symbolfx2, expirydatefx2, tradedatefx2, buysellfx2, buysellPricefx2, mktpricefx2, daysopenfx2, unrealizedfx2, pctpnlfx, strikepricefx2, optiontypefx2, quantityfx2, todayMTMfx, todaypctfx); – jay