問題描述
事件調度線程從列表異常 SWING 中移除 (Event dispatching thread remove from List exception SWING)
Hi I have this strange exception when trying to remove a element from list in JPanel which implements the State interface. Here is the code:
public static class ButtonListener implements ActionListener {
private State state;
public ButtonListener(State state) {
this.state = state;
}
@Override
public void actionPerformed(ActionEvent e) {
state.applyMove(state.getMoves().get(0));
}
}
And the JPanel where is the implementation of "applyMove" method:
public class RushHourBoard extends JPanel implements MouseListener, MouseMotionListener, State {
...
private List<Vehicle> vehicles;
...
@Override
public State applyMove(Move vehicleMove) {
VehicleMove move = (VehicleMove) vehicleMove;
Vehicle moved = move.getVehicle();
vehicles.remove(moved);
...
And the trace of the exception:
Exception in thread "AWT‑EventQueue‑0" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:161)
at entrery.rushhour.RushHourBoard.applyMove(RushHourBoard.java:174)
at entrery.rushhour.MyDragDemo$ButtonListener.actionPerformed(MyDragDemo.java:59)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6504)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6269)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4860)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Is this something with UI thread security policy ? Thanks in advances for your help.
‑‑‑‑‑
參考解法
方法 1:
The instance assigned to RushHourBoard.vehicles
does not support removal. Perhaps it is from Arrays.asList
or Collections.unmodifiableList
.
List
, like many in Java collections, is a poor interface. It's so unspecific many of the methods may not be implemented (usefully). Even with a loose contract, many of the collection implementations don't even conform to the minimal terms of the interfaces they implement.
(by EnTrERy、Tom Hawtin ‑ tackline)