On Thu, 27 Feb 2020 21:29:27 GMT, Martin Polakovic <github.com+5527071+sghpjui...@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