RFR: 8185886: Improve scrolling performance of TableView and TreeTableView

Nir Lisker nlisker at openjdk.java.net
Fri Apr 3 10:58:02 UTC 2020


On Thu, 27 Feb 2020 21:29:27 GMT, Martin Polakovic <github.com+5527071+sghpjuikit at openjdk.org> wrote:

>> 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();
>>     }
>> 
>> }
>
> I took the liberty of pointing out some formatting errors

The title of your PR should match the title of the JBS issue. Moreover, #108 already tackles this issue with a
different approach and 2 PRs on the same issue can't be intetgrated. Since I'm not familiar with this code, I can't
advise on who's solution is more suitable. I suggest you discuss both of the approaches on the mailing list. I saw many
JBS issues around this performance issue, probably one of them fits (or a new one can be created).

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

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


More information about the openjfx-dev mailing list