2012-10-27 81 views
1

我試圖刪除JList中的選擇項,點擊了一個項目後,因爲它不能再次單擊而不移動選擇項。在java swing中從JList中刪除選擇

I'vet試過這個,但不斷收到錯誤,我不知道發生了什麼。

ListSelectionModel mode = new DefaultListSelectionModel(); 
    mode.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    mode.addListSelectionListener(new ListSelectionListener() 
    { 
     public void valueChanged(ListSelectionEvent evt) 
     { 

      // Åben url'en i en browser 
      if(!evt.getValueIsAdjusting()) 
      { 

       if(isDownloaded(data_alle.get(list_alle.getSelectedIndex()),data_downloaded)) 
       { 
        try { 
         Desktop.getDesktop().open(new File(data_downloaded.get(list_alle.getSelectedIndex()).getPath())); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
       else 
       { 
        OpenURI.open(data_alle.get(list_alle.getSelectedIndex()).getUrl(), url); 
       } 
       list_alle.clearSelection(); 

      } 
     } 

    }); 

    list_alle.setSelectionModel(mode); 

和錯誤:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 
at java.util.ArrayList.get(Unknown Source) 
at gui.Kursus$2.valueChanged(Kursus.java:114) 
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) 
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) 
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) 
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source) 
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source) 
at javax.swing.DefaultListSelectionModel.removeSelectionIntervalImpl(Unknown Source) 
at javax.swing.DefaultListSelectionModel.clearSelection(Unknown Source) 
at javax.swing.JList.clearSelection(Unknown Source) 
at gui.Kursus$2.valueChanged(Kursus.java:127) 
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) 
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) 
at javax.swing.DefaultListSelectionModel.setValueIsAdjusting(Unknown Source) 
at javax.swing.JList.setValueIsAdjusting(Unknown Source) 
at javax.swing.plaf.basic.BasicListUI$Handler.mouseReleased(Unknown Source) 
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$000(Unknown Source) 
at java.awt.EventQueue$1.run(Unknown Source) 
at java.awt.EventQueue$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$2.run(Unknown Source) 
at java.awt.EventQueue$2.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
+1

您沒有顯示相關的代碼。問題在於你的'dostuff',但你不顯示那個部分。作爲一般規則,特別是Swing問題,請發佈[SSCCE](http://sscce.org)。另外,我會避免在處理列表選擇事件時清除選擇。至少將代碼移動到一個'SwingUtilities.invokeLater()'中。 –

+1

'gui.Kursus $ 2.valueChanged(Kursus.java:114)'是什麼行114? –

+0

異常消息明確指出gui.Kursus $ 2.valueChanged()(Kursus.java,第114行)調用ArrayList上的get(-1);但是列表索引從0開始。 – ignis

回答

2

在您選擇處理程序,你不能做任何越界檢查所選項目

if(!evt.getValueIsAdjusting() && list_alle.getSelectedIndex() >= 0) {...} 

什麼中發生的

  1. 選擇的變化,進入你的處理程序代碼,您辦理變更手續,並清除選擇
  2. 您的H安德勒被通知更改選擇(再次),您處理該更改並點擊ArrayOutOfBoundsException,因爲沒有選擇任何東西
0

由於相關的代碼/線路編號是從從你的問題不見了,我最好的猜測如下:

我有選擇的操作類似的問題爲JList。當您確定所選內容的索引時,getMinSelectionIndex()和相關調用的報告索引有時會將0報告爲負數(可能與增量有關,但我承認不確定)。將手動檢查,以確保您正在使用的指標是不是負數:

89  class SharedListSelectionHandler implements ListSelectionListener { 
90   public void valueChanged(ListSelectionEvent e) { 
91    ListSelectionModel lsm = (ListSelectionModel)e.getSource(); 
92 
93    if (!lsm.getValueIsAdjusting()){ 
94     int index = lsm.getMinSelectionIndex(); 
95     if (index < 0) { 
96      index = 0; 
97     } 
98     handleListSelectionEvent(index); 
99    } 
100 
101   } 
102  } 
+0

如果沒有選擇任何內容,list_alle.getSelectedIndex()將返回-1,這是記錄的行爲 – MadProgrammer