微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在与 EDT 不同的线程中从 JList 中删除项目

如何解决在与 EDT 不同的线程中从 JList 中删除项目

我查看了其他似乎与此类似的问题,但不同的是在这种情况下我没有 selectedindex。

我试图在循环遍历 for 循环时从 JList 中删除一个元素。为了找出我要删除的元素,我对定义的工具提示进行了比较,然后仅删除该元素。

public static void removeElement(JList list,String idx){
    DefaultListModel model = (DefaultListModel)list.getModel();
    JLabel actual;
    for(int i = 0; i < model.getSize(); i++){
        actual = (JLabel) model.get(i);
         if(actual.getToolTipText().equals(idx)){
             model.remove(i);
             break;
         }
    }
}

这个函数在主类中声明,访问swing元素,也声明为静态。 然后该函数被另一个线程调用

public class threadExample extends Thread{
    //...
    @Override
    public void run() {
        Main.removeElement(OIS.listElement,graphicalID);
    }
    
}

执行此异常时出现,但只是有时。

Exception in thread "AWT-EventQueue-0" java.lang.Arrayindexoutofboundsexception: 1 >= 1
    t java.base/java.util.Vector.elementAt(Vector.java:497)
    at java.desktop/javax.swing.DefaultListModel.getElementAt(DefaultListModel.java:90)
    at java.desktop/javax.swing.plaf.basic.BasicListUI.paintCell(BasicListUI.java:265)
    at java.desktop/javax.swing.plaf.basic.BasicListUI.paintImpl(BasicListUI.java:378)
    at java.desktop/javax.swing.plaf.basic.BasicListUI.paint(BasicListUI.java:301)
    at java.desktop/javax.swing.plaf.synth.SynthListUI.update(SynthListUI.java:78)
    at java.desktop/javax.swing.JComponent.paintComponent(JComponent.java:797)
    at java.desktop/javax.swing.JComponent.paint(JComponent.java:1074)
    at java.desktop/javax.swing.JComponent.paintToOffscreen(JComponent.java:5255)
    at java.desktop/javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:246)
    at java.desktop/javax.swing.RepaintManager.paint(RepaintManager.java:1323)
    at java.desktop/javax.swing.JComponent._paintImmediately(JComponent.java:5203)
    at java.desktop/javax.swing.JComponent.paintImmediately(JComponent.java:5013)
    at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:865)
    at java.desktop/javax.swing.RepaintManager$4.run(RepaintManager.java:848)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:848)
    at java.desktop/javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:823)
    at java.desktop/javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:772)
    at java.desktop/javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1890)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
    at java.desktop/java.awt.EventdispatchThread.pumpOneEventForFilters(EventdispatchThread.java:203)
    at java.desktop/java.awt.EventdispatchThread.pumpEventsForFilter(EventdispatchThread.java:124)
    at java.desktop/java.awt.EventdispatchThread.pumpEventsForHierarchy(EventdispatchThread.java:113)
    at java.desktop/java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:109)
    at java.desktop/java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:101)
    at java.desktop/java.awt.EventdispatchThread.run(EventdispatchThread.java:90)

从我所读到的内容来看,我无法像正在做的那样在 for 循环中进行删除,但我找不到任何替代方法。有人可以帮我吗?

编辑

问题不在于删除过程,而是因为我在与 EDT 不同的线程中执行操作。

解决方法

因为您似乎是在与 EDT 不同的线程中调用 removeElement,所以您应该使用:

SwingUtilities.invokeLater(() -> { removeElement(....); }

用于异步执行,或

SwingUtilities.invokeAndWait(() -> { removeElement(....); }

如果你想在继续之前等待方法完成。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。