Передаю в TableView
1.
table.setItems(new TransactionalList<>(service.getTemplates()));
свой кастомный класс
1.
public class TransactionalList<T> extends ModifiableObservableListBase<T> {}
все работает хорошо, пока не пробую нажать на колонку для сортировки
вылетает
воттакое
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)
при этом ни на что это не влияет, т.е. в консоль вылетает, но сортировка отрабатывает и никаких видимых ошибок.
если написать вот так
1.
templatesTable.setItems(FXCollections.observableArrayList(service.getTemplates()));
ошибка не вылетает.
код TransactionalList
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();
}
}
где я напортачил? может кто встречал, или есть идеи почему так?
-----
Если дела идут плохо, есть вероятность, что в ближайшее время они пойдут ещё хуже.(с)Мерфи