JavaFX TableView selectAll очень медленно - PullRequest
0 голосов
/ 23 января 2019

Я только что узнал, что метод выбора JavaFX TableView selectAll() -метод чрезвычайно медленный, когда в таблице достаточно данных - у меня не хватило терпения ждать, сколько времени потребуется для 50000 строк.

У всех естькакие-либо обходные решения о том, как выбрать все элементы одновременно?

В противном случае TableView по умолчанию включает Ctrl+A для выбора всех своих строк.Как мне продолжить отключение этого ярлыка?

Вот пример кода, чтобы продемонстрировать медлительность, просто нажмите Ctrl+A:

@Override
public void start(Stage primaryStage) throws Exception {
    TableView<String> table = new TableView<>();

    table.getColumns().add(new TableColumn<>("first"));
    table.getColumns().add(new TableColumn<>("second"));
    table.getColumns().add(new TableColumn<>("third"));

    table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

    ObservableList<String> data = FXCollections.observableArrayList();
    for (int i = 0; i < 50000; i++) {
        byte[] array = new byte[10];
        new Random().nextBytes(array);
        String generatedString = new String(array, Charset.forName("UTF-8"));
        data.add(generatedString);
    }
    table.setItems(data);

    StackPane root = new StackPane();
    root.getChildren().add(table);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}

1 Ответ

0 голосов
/ 23 января 2019

Я не испытываю того же поведения, которое вы описали.Изменение размера вашего примера с 50.000 до 500.000 добавляет небольшую задержку между нажатием клавиши и обновлением пользовательского интерфейса.Может быть, эта проблема связана с CPU / Ram?Я запускаю ваш пример на следующих спецификациях

ОС: Win10 - Процессор: Intel i7-6700 - ОЗУ: 16 ГБ - Java: Oracle JDK 1.8.0_162.

Чтобы ответить на ваш вопрос, тем не менее,Вы можете зарегистрировать ключ EventHandler , чтобы получать уведомления о нажатиях клавиш (или взлетах / падениях).Если событие описывает Ctrl + A, вызовите потребление , чтобы остановить его распространение на дальнейших слушателей (сама таблица).

table.setOnKeyPressed(event -> {
  if (event.getCode() == KeyCode.A && event.isControlDown()) {
    event.consume();
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...