Java 事件调度线程从列表异常SWING中删除

Java 事件调度线程从列表异常SWING中删除,java,collections,Java,Collections,嗨,当我试图从实现状态接口的JPanel中的列表中删除一个元素时,出现了这个奇怪的异常。代码如下: public static class ButtonListener implements ActionListener { private State state; public ButtonListener(State state) { this.state = state; } @Override public void actio

嗨,当我试图从实现状态接口的JPanel中的列表中删除一个元素时,出现了这个奇怪的异常。代码如下:

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));
    }
}
JPanel是“applyMove”方法的实现:


这与UI线程安全策略有关吗?谢谢你的帮助

分配给
RushHourBoard.vehicles
的实例不支持删除。它可能来自
数组.asList
集合.unmodifiableList


List
,就像Java集合中的许多一样,是一个糟糕的接口。这是如此的不具体,许多方法可能无法实现(有用)。即使是松散的合同,许多集合实现甚至不符合它们实现的接口的最低条款。

为了更快地获得更好的帮助,请发布一篇文章。这与Swing无关,而与您的vehicles变量实际上是什么类型的具体列表有关,这是您没有向我们展示的。它不支持删除。如何创建
vehicles
变量?@HovercraftFullOfEels LOL你说得对,我使用的是Arrays.asList()。。。用于测试,这就是问题所在!你能解释一下与普通列表实现和这个有什么区别吗?恩,我所知道的是,并不是所有列表实现都支持
remove()
方法,正如注释中的其他人一样。。。非常感谢。这是我愚蠢的误会…@Entry这是一个足够公平的问题,尽管周围都是无关的细节。我想真正的技巧是隔离问题。
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);
    ...
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)