Skip to content

Instantly share code, notes, and snippets.

@TomasMikula
Last active June 1, 2021 18:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save TomasMikula/1dcee2cc4e5dab421913 to your computer and use it in GitHub Desktop.
Save TomasMikula/1dcee2cc4e5dab421913 to your computer and use it in GitHub Desktop.
ListView vs. Flowless
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.layout.Region;
import javafx.stage.Stage;
import org.fxmisc.flowless.Cell;
import org.fxmisc.flowless.VirtualFlow;
import com.sun.javafx.tk.Toolkit;
public class FlowlessBenchmark extends Application {
public static void main(String[] args) {
launch(args);
}
private int counter = 0;
private int layoutCounter = 0;
@Override
public void start(Stage primaryStage) {
ObservableList<String> items = FXCollections.observableArrayList();
for(int i = 0; i < 20; ++i) {
items.addAll("red", "green", "blue", "purple");
}
VirtualFlow<String, ?> flow = VirtualFlow.createVertical(
items,
color -> reg(color));
Scene scene = new Scene(flow, 200, 400);
primaryStage.setScene(scene);
primaryStage.show();
Platform.runLater(() -> {
Toolkit.getToolkit().firePulse();
System.out.println("Number of cell creations/layouts when:");
counter = 0;
layoutCounter = 0;
items.set(10, "yellow");
Toolkit.getToolkit().firePulse();
System.out.println(" - updating an item in the viewport: " + counter + "/" + layoutCounter);
counter = 0;
layoutCounter = 0;
items.set(30, "yellow");
Toolkit.getToolkit().firePulse();
System.out.println(" - updating an item outside the viewport: " + counter + "/" + layoutCounter);
counter = 0;
layoutCounter = 0;
items.remove(12);
Toolkit.getToolkit().firePulse();
System.out.println(" - deleting an item in the middle of the viewport: " + counter + "/" + layoutCounter);
counter = 0;
layoutCounter = 0;
items.add(12, "yellow");
Toolkit.getToolkit().firePulse();
System.out.println(" - adding an item in the middle of the viewport: " + counter + "/" + layoutCounter);
counter = 0;
layoutCounter = 0;
flow.showAsFirst(5);
Toolkit.getToolkit().firePulse();
System.out.println(" - scrolling 5 items down: " + counter + "/" + layoutCounter);
counter = 0;
layoutCounter = 0;
flow.showAsFirst(55);
Toolkit.getToolkit().firePulse();
System.out.println(" - scrolling 50 items down: " + counter + "/" + layoutCounter);
});
}
private Cell<String, Region> reg(String color) {
counter += 1;
Region reg = new Region() {
@Override
protected void layoutChildren() {
layoutCounter += 1;
super.layoutChildren();
}
};
reg.setPrefHeight(16);
reg.setStyle("-fx-background-color: " + color);
return Cell.wrapNode(reg);
}
}
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.Region;
import javafx.stage.Stage;
import com.sun.javafx.tk.Toolkit;
public class ListViewBenchmark extends Application {
public static void main(String[] args) {
launch(args);
}
private int counter = 0;
private int layoutCounter = 0;
@Override
public void start(Stage primaryStage) {
ObservableList<String> items = FXCollections.observableArrayList();
for(int i = 0; i < 20; ++i) {
items.addAll("red", "green", "blue", "purple");
}
ListView<String> listView = new ListView<>(items);
listView.setFixedCellSize(16.0);
listView.setCellFactory(lv -> rect());
Scene scene = new Scene(listView, 200, 400);
primaryStage.setScene(scene);
primaryStage.show();
Platform.runLater(() -> {
Toolkit.getToolkit().firePulse();
System.out.println("Number of updateItems/layouts when:");
counter = 0;
layoutCounter = 0;
items.set(10, "yellow");
Toolkit.getToolkit().firePulse();
System.out.println(" - updating an item in the viewport: " + counter + "/" + layoutCounter);
counter = 0;
layoutCounter = 0;
items.set(30, "yellow");
Toolkit.getToolkit().firePulse();
System.out.println(" - updating an item outside the viewport: " + counter + "/" + layoutCounter);
counter = 0;
layoutCounter = 0;
items.remove(12);
Toolkit.getToolkit().firePulse();
System.out.println(" - deleting an item in the middle of the viewport: " + counter + "/" + layoutCounter);
counter = 0;
layoutCounter = 0;
items.add(12, "yellow");
Toolkit.getToolkit().firePulse();
System.out.println(" - adding an item in the middle of the viewport: " + counter + "/" + layoutCounter);
counter = 0;
layoutCounter = 0;
listView.scrollTo(5);
Toolkit.getToolkit().firePulse();
System.out.println(" - scrolling 5 items down: " + counter + "/" + layoutCounter);
counter = 0;
layoutCounter = 0;
listView.scrollTo(55);
Toolkit.getToolkit().firePulse();
System.out.println(" - scrolling 50 items down: " + counter + "/" + layoutCounter);
});
}
private ListCell<String> rect() {
return new ListCell<String> () {
{ setStyle("-fx-padding: 0"); }
@Override
protected void updateItem(String color, boolean empty) {
super.updateItem(color, empty);
setText(null);
if(empty) {
setGraphic(null);
} else {
counter += 1;
Region reg = new Region() {
@Override
protected void layoutChildren() {
layoutCounter += 1;
super.layoutChildren();
}
};
reg.setPrefHeight(16);
reg.setStyle("-fx-background-color: " + color);
setGraphic(reg);
}
}
};
}
}

Tested with JDK 8u40.

ListViewBenchmark:

Number of updateItems/layouts when:
 - updating an item in the viewport: 1/1
 - updating an item outside the viewport: 0/0
 - deleting an item in the middle of the viewport: 38/25
 - adding an item in the middle of the viewport: 38/25
 - scrolling 5 items down: 5/5
 - scrolling 50 items down: 25/25

FlowlessBenchmark:

Number of cell creations/layouts when:
 - updating an item in the viewport: 1/1
 - updating an item outside the viewport: 0/0
 - deleting an item in the middle of the viewport: 1/1
 - adding an item in the middle of the viewport: 1/1
 - scrolling 5 items down: 5/5
 - scrolling 50 items down: 25/25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment