首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使TreeTableView工作

使TreeTableView工作
EN

Stack Overflow用户
提问于 2015-01-19 08:05:35
回答 1查看 4.5K关注 0票数 0

我有一个Tableview,我正试图将它转换成TreeTableView。让它充满对我来说并不容易。这是相关代码。如何填充TreeTable列,以及如何动态填充TreeItem

来自FXMLFile

代码语言:javascript
复制
<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>

控制器代码

代码语言:javascript
复制
@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

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-19 19:03:43

在您的fetchOpenPositions(...)方法中,重新为参数分配一个新的TreeTableView (然后不要对它做任何事情,比如将它放在场景图中)。因此,任何其他配置都是在新的TreeTableView上进行的,而不是由FXML文件创建的配置。

只需替换

代码语言:javascript
复制
treetableView = new TreeTableView<>(root);

使用

代码语言:javascript
复制
treetableView.setRoot(root);

此外,单元格值工厂实现看起来像是返回了一个String,而不是一个ObservableValue<String>。如果您的OpenPositions类定义了一个属性访问器方法(推荐的方法):

代码语言:javascript
复制
public StringProperty valueProperty() { ... }

然后

代码语言:javascript
复制
symbolfx2.setCellValueFactory( param -> param.getValue().symbolProperty() );

应该行得通。否则你就需要

代码语言:javascript
复制
symbolfx2.setCellValueFactory( param -> new ReadOnlyStringWrapper(param.getValue().getSymbol()));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28020226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档