[Rev 01] RFR: 8185886: Improve scrolling performance of TableView and TreeTableView
yosbits
github.com+7517141+yososs at openjdk.java.net
Sat Apr 18 16:49:28 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();
> }
>
> }
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
More information about the openjfx-dev
mailing list