2011-12-11 2 views
1

У меня этот пользовательский CellFactory в моем таблицеView. При прокрутке этот столбец выполняется исключительно медленно. Любая причина, почему это так, и как я могу ее улучшить.Javafx 2.0 Медленная колонка с пользовательским CellFactory в TableView

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; 
    } 
}); 

ответ

4

Две вещи, которые вы должны начать делать это:

1) Вместо SetStyle вызова (...), называют getStyleClass() добавить (...), а затем использовать внешний CSS. файл для определения классов стилей. Анализ CSS во время выполнения медленный, и этого можно избежать.

2) Повторное использование VBox и Label, а не воссоздание его каждый раз, когда вызывается updateItem. Сделайте это, переместив VBox и Label за пределы метода updateItem (но сохраните его в новой таблице TableCell <>().

Однако .... взяв 2) немного дальше, сомневаюсь, что вам нужен либо VBox, либо метка. Просто установите класс стиля в самой ячейке и установите текст в ячейке с помощью setText (...).

- Jonathan

+0

Оба решения работали идеально. Пойдем теперь и посмотрим, когда совершу те же ошибки. Благодарю. –