Проще говоря, у меня есть табличное представление с одним столбцом, который я хочу отсортировать и сортировать каждый раз, когда добавляю новый элемент в наблюдаемый список. Я просмотрел несколько примеров и похожих вопросов в Интернете, но у меня ничего не получалось. Если я попытаюсь вызвать 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);
}
}