【问题标题】:Javafx 2.0 Slow Column with Custom CellFactory in TableView在 TableView 中具有自定义 CellFactory 的 Javafx 2.0 慢列
【发布时间】:2011-12-11 18:02:57
【问题描述】:

我的 tableView 中有这个自定义 CellFactory。滚动时,该列异常缓慢。为什么会这样,我该如何改进它。

lastTradeColumn.setCellFactory(
   new Callback<TableColumn<Stock, Price>,TableCell<Stock, Price>>(){
      @Override public TableCell<Stock, Price> call( TableColumn<Stock, Price> p ) {
         TableCell<Stock, Price> cell = new TableCell<Stock, Price>() {
            @Override public void updateItem(Price price, boolean empty) {
               super.updateItem(price, empty);
               if (price != null) {
                  VBox vbox = new VBox(5);
                  vbox.getChildren().add(new Label("£"+price.toString()));
                  if( price.getOldPrice() > price.getNewPrice()) {
                     vbox.setStyle("-fx-background-color:#EA2A15;");
                  }
                  else if( price.getOldPrice() < price.getNewPrice()) {
                     vbox.setStyle("-fx-background-color:#9CF311;");
                  }
                  setGraphic( vbox );
               }
            }
         };
         return cell;
   }
});

【问题讨论】:

    标签: java javafx javafx-2


    【解决方案1】:

    你应该首先做的两件事是:

    1) 与其调用 setStyle(...),不如调用 getStyleClass().add(...),然后使用外部 CSS 文件来定义样式类。在运行时解析 CSS 很慢,应该避免显示。

    2) 重用 VBox 和 Label,而不是每次调用 updateItem 时都重新创建它。通过将 VBox 和 Label 移到 updateItem 方法之外来做到这一点(但将其保留在新的 TableCell() 大括号内。

    但是....采取 2) 更进一步,我怀疑您需要 VBox 或标签。只需在单元格本身上设置样式类,然后使用 setText(...) 针对单元格设置文本。

    -- 乔纳森

    【讨论】:

    • 两种解决方案都很完美。现在将四处走走,看看我何时犯了同样的错误。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-01-21
    • 2016-11-24
    • 2015-12-01
    • 1970-01-01
    • 2012-08-04
    • 2015-02-10
    • 2016-12-15
    • 1970-01-01
    相关资源
    最近更新 更多