> If there are many columns, the current TableView will stall scrolling. 
> Resolving this performance issue requires column
> virtualization. Virtualization mode is enabled when the row height is fixed 
> by the following method.
> `tableView.setFixedCellSize(height)`
> 
> This proposal includes a fix because the current code does not correctly 
> implement column virtualization.
> 
> The improvement of this proposal can be seen in the following test program.
> 
>  Java
> import javafx.animation.AnimationTimer;
> import javafx.application.Application;
> import javafx.beans.property.SimpleStringProperty;
> import javafx.collections.ObservableList;
> import javafx.scene.Scene;
> import javafx.scene.control.TableColumn;
> import javafx.scene.control.TableView;
> import javafx.scene.layout.BorderPane;
> import javafx.stage.Stage;
> 
> public class BigTableViewTest2 extends Application {
> 
>       private static final boolean USE_WIDTH_FIXED_SIZE = true;
>       private static final boolean USE_HEIGHT_FIXED_SIZE = true;
> //    private static final int COL_COUNT=300;
>       private static final int COL_COUNT=600;
> //    private static final int COL_COUNT=1000;
>       private static final int ROW_COUNT=1000;
> 
>       @Override
>       public void start(Stage primaryStage) throws Exception {
>           final TableView<String[]> tableView = new TableView<>();
> 
>           final ObservableList<TableColumn<String[], ?>> columns = 
> tableView.getColumns();
>       for(int i=0; i<COL_COUNT; i++) {
>               TableColumn<String[], String> column = new 
> TableColumn<>("Col"+i);
>               final int colIndex=i;
>               column.setCellValueFactory((cell)->new 
> SimpleStringProperty(cell.getValue()[colIndex]));
>                       columns.add(column);
>                       if(USE_WIDTH_FIXED_SIZE) {
>                               column.setPrefWidth(60);
>                               column.setMaxWidth(60);
>                               column.setMinWidth(60);
>                       }
>       }
>     
>       ObservableList<String[]> items = tableView.getItems();
>       for(int i=0; i<ROW_COUNT; i++) {
>               String[] rec = new String[COL_COUNT];
>               for(int j=0; j<rec.length; j++) {
>                       rec[j] = i+":"+j;
>               }
>               items.add(rec);
>       }
>               BorderPane root = new BorderPane(tableView);
>               if(USE_HEIGHT_FIXED_SIZE) {
>                       tableView.setFixedCellSize(24);
>               }
> 
>       Scene scene = new Scene(root, 800, 800);
>       primaryStage.setScene(scene);
>       primaryStage.show();
>       prepareTimeline(scene);
>     
>       }
> 
>       public static void main(String[] args) {
>               Application.launch(args);
>       }
> 
>     private void prepareTimeline(Scene scene) {
>         new AnimationTimer() {
>             @Override public void handle(long now) {
>                 double fps =  
> com.sun.javafx.perf.PerformanceTracker.getSceneTracker(scene).getInstantFPS();
>                 ((Stage)scene.getWindow()).setTitle("FPS:"+(int)fps);
>             }
>         }.start();
>     }
> 
> }

yosbits has updated the pull request incrementally with one additional commit 
since the last revision:

  8185886: Fix scroll performance of TableView with many columns

-------------

Changes:
  - all: https://git.openjdk.java.net/jfx/pull/125/files
  - new: https://git.openjdk.java.net/jfx/pull/125/files/04951abf..19fabf2e

Webrevs:
 - full: https://webrevs.openjdk.java.net/jfx/125/webrev.01
 - incr: https://webrevs.openjdk.java.net/jfx/125/webrev.00-01

  Stats: 48 lines in 1 file changed: 24 ins; 19 del; 5 mod
  Patch: https://git.openjdk.java.net/jfx/pull/125.diff
  Fetch: git fetch https://git.openjdk.java.net/jfx pull/125/head:pull/125

PR: https://git.openjdk.java.net/jfx/pull/125

Reply via email to