簡體   English   中英

在與 EDT 不同的線程中從 JList 中刪除項目

[英]Delete item from JList in a different thread than EDT

我試圖在循環通過 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;
         }
    }
}

這個 function 在主 class 中聲明,並訪問 swing 元素,也聲明為 ZA81259CEF45659C394EDF1。 function 然后被另一個線程調用:

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(....); }

如果您想在繼續之前等待該方法完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM