powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Javafx TableView ObservableList и IndexOutOfBoundsException при sort
2 сообщений из 2, страница 1 из 1
Javafx TableView ObservableList и IndexOutOfBoundsException при sort
    #38857732
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Передаю в TableView
Код: java
1.
table.setItems(new TransactionalList<>(service.getTemplates()));


свой кастомный класс
Код: java
1.
public class TransactionalList<T> extends ModifiableObservableListBase<T> {}


все работает хорошо, пока не пробую нажать на колонку для сортировки
вылетает
воттакое
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException
	at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(ReadOnlyUnbackedObservableList.java:136)
	at javafx.collections.ListChangeListener$Change.getAddedSubList(ListChangeListener.java:242)
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.handleSelectedCellsListChangeEvent(TableView.java:2786)
	at javafx.scene.control.TableView$TableViewArrayListSelectionModel.access$1800(TableView.java:1959)
	at javafx.scene.control.TableView.sort(TableView.java:1488)
	at javafx.scene.control.TableView.doSort(TableView.java:1513)
	at javafx.scene.control.TableView.lambda$new$40(TableView.java:652)
	at javafx.scene.control.TableView$$Lambda$92/28960348.invalidated(Unknown Source)
	at javafx.beans.WeakInvalidationListener.invalidated(WeakInvalidationListener.java:83)
	at com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:349)
	at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
	at javafx.beans.property.ObjectPropertyBase.fireValueChangedEvent(ObjectPropertyBase.java:105)
	at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112)
	at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:145)
	at javafx.scene.control.TableColumn.setSortType(TableColumn.java:459)
	at com.sun.javafx.scene.control.TableColumnSortTypeWrapper.setSortType(TableColumnSortTypeWrapper.java:54)
	at com.sun.javafx.scene.control.skin.TableColumnHeader.sortColumn(TableColumnHeader.java:768)
	at com.sun.javafx.scene.control.skin.TableColumnHeader.lambda$static$54(TableColumnHeader.java:241)
	at com.sun.javafx.scene.control.skin.TableColumnHeader$$Lambda$172/4145001.handle(Unknown Source)
	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
	at javafx.event.Event.fireEvent(Event.java:198)
	at javafx.scene.Scene$MouseHandler.process(Scene.java:3724)
	at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3452)
	at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1728)
	at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2461)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:348)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:273)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:382)
	at com.sun.glass.ui.View.handleMouseEvent(View.java:553)
	at com.sun.glass.ui.View.notifyMouse(View.java:925)
	at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
	at com.sun.glass.ui.gtk.GtkApplication.lambda$null$45(GtkApplication.java:126)
	at com.sun.glass.ui.gtk.GtkApplication$$Lambda$44/32289937.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:745)



при этом ни на что это не влияет, т.е. в консоль вылетает, но сортировка отрабатывает и никаких видимых ошибок.

если написать вот так
Код: java
1.
templatesTable.setItems(FXCollections.observableArrayList(service.getTemplates()));


ошибка не вылетает.

код TransactionalList
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
public class TransactionalList<T> extends ModifiableObservableListBase<T> {

    private List<T> originalList;
    private List<T> workList = new ArrayList<>();
    private List<T> addedElements = new ArrayList<>();
    private List<T> deletedElements = new ArrayList<>();

    public TransactionalList(@Nonnull List<T> originalList) {
        this.originalList = originalList;
        workList.addAll(originalList);
    }

    @Override
    public T get(int index) {
        return workList.get(index);
    }

    @Override
    public int size() {
        return workList.size();
    }

    @Override
    protected void doAdd(int index, T element) {
        workList.add(index, element);
        addedElements.add(element);
    }

    @Override
    protected T doSet(int index, T element) {
        T elem = workList.set(index, element);
        addedElements.add(element);
        deletedElements.add(elem);
        return elem;
    }

    @Override
    protected T doRemove(int index) {
        T element = workList.remove(index);
        if(elementWasAddedInCurrentTransaction(element)) {
            addedElements.remove(element);
            return element;
        } else {
            deletedElements.add(element);
        }
        return element;
    }

    private boolean elementWasAddedInCurrentTransaction(T element) {
        return addedElements.contains(element);
    }

    public void commitChanges() {
        deletedElements.forEach(originalList::remove);
        deletedElements.clear();
        addedElements.forEach(originalList::add);
        addedElements.clear();
    }

    public void rollBack() {
        workList.clear();
        workList.addAll(originalList);
        addedElements.clear();
        deletedElements.clear();
    }
}



где я напортачил? может кто встречал, или есть идеи почему так?

-----
Если дела идут плохо, есть вероятность, что в ближайшее время они пойдут ещё хуже.(с)Мерфи
...
Рейтинг: 0 / 0
Javafx TableView ObservableList и IndexOutOfBoundsException при sort
    #38857753
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сам спросил, сам ответил
http://javatalks.ru/topics/44124
sptimНашел таки в чем было дело - исключение возникает только в случае, если список строк данных не реализует интерфейс SortableList (в этом случае при вызове сортировки списка он пересоздаётся заново и модель выделения очищается). Все же это именно недоработка в TableView (пытается получить подмножество выделенных ячеек, в то время как список выделенных ячеек уже пуст = исключение).

Почему не происходит ошибки в вышеприведенном примере - потому что FXCollections.observableArrayList() создаёт список на базе враппера, реализующего SortableList.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Javafx TableView ObservableList и IndexOutOfBoundsException при sort
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]