Ошибки при сортировке таблицы - PullRequest
0 голосов
/ 19 апреля 2019

Проще говоря, у меня есть табличное представление с одним столбцом, который я хочу отсортировать и сортировать каждый раз, когда добавляю новый элемент в наблюдаемый список. Я просмотрел несколько примеров и похожих вопросов в Интернете, но у меня ничего не получалось. Если я попытаюсь вызвать TableView.sort () из прослушивателя изменений списка, похоже, ничего не произойдет.

Когда я добавляю столбец к порядку сортировки таблицы, это приводит к проблемам. Попытка отсортировать таблицу после этого приводит к серьезному сбою приложения. Единственная ошибка - «Исключение в методе запуска приложения». Затем я переместил вызов sort () в Platform.runLater (), и это предотвращает сбой приложения. Но затем возникла новая проблема. При вызове sort я получаю ошибку индекса массива за пределами границ, которая кажется случайной, хотя я думаю, что в основном, когда новые элементы превышают представление таблицы и нуждаются в полосе прокрутки.

Во время написания этого я переместил сортировку из прослушивателя изменений вниз вниз в Задачу, где я добавляю фактические данные. Нет больше ошибок. Поэтому я предполагаю, что мой новый вопрос: почему у меня так много проблем, когда я пытаюсь что-то сделать от слушателя?

public class Temp extends Application{


    private ObservableList<String> libraryList = FXCollections.observableArrayList();


    public void start(Stage stage) {

        Label statusLabel = new Label("stuff goes here");

        TableView<String> table = new TableView<String>(libraryList);
        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

        TableColumn<String, String> col = new TableColumn<String, String>("Stuff");
        col.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue()));
        table.getColumns().add(col);
        table.getSortOrder().add(col);





        libraryList.addListener(new ListChangeListener<String>() {
            public void onChanged(Change change) {


                Platform.runLater(()->{
                    table.sort();
                    statusLabel.setText(libraryList.size()+" entries");
                });

            }

        });





        // dummy stuff
        libraryList.add("foo");
        libraryList.add("bar");



        Button b = new Button("Press Me");
        b.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                FileTask task = new FileTask();
                new Thread(task).start();
            }
        });


        BorderPane mainBody = new BorderPane();

        mainBody.setTop(statusLabel);
        mainBody.setCenter(table);
        mainBody.setBottom(b);
        Scene scene = new Scene(mainBody);
        stage.setScene(scene);
        stage.show();

    }








    class FileTask extends Task<Boolean>{

        public FileTask(){

        }


        protected Boolean call() throws Exception{

            Random rand = new Random();
            for(int i = 0; i < 3; i++) {
                String s = ""+rand.nextInt(Integer.MAX_VALUE);
                libraryList.add(s);
            }

            return true;
        }



    }







    public static void main(String[] args) {
        Application.launch(args);

    }
}

1 Ответ

0 голосов
/ 20 апреля 2019

Кажется, теперь я понимаю проблему.Когда я добавляю элемент в список, он вызывает onChanged ().Когда я сортирую таблицу, она также вызывает onChanged, создавая бесконечный цикл.Я не осознавал, что таблица сортирует данные, фактически изменяя сам список.

...