RFR: 8185886: Improve scrolling performance of TableView and TreeTableView

yosbits github.com+7517141+yososs at openjdk.java.net
Fri Apr 3 10:58:01 UTC 2020


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

}

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

Commit messages:
 - 8185886: Fix scroll performance of TableView with many columns

Changes: https://git.openjdk.java.net/jfx/pull/125/files
 Webrev: https://webrevs.openjdk.java.net/jfx/125/webrev.00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8185886
  Stats: 174 lines in 2 files changed: 78 ins; 55 del; 41 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


More information about the openjfx-dev mailing list