2012-02-27 99 views
-1

我對Java很新,已經使用了Visual Basic多年。我使用NetBeans創建了一個基本的GUI。它包含一個名爲lstMain的jList。我創建了一個名爲LISTMODEL的DefaultListModel,並且可以將String項添加到jList。當我嘗試刪除使用的項目時我試圖從jList中移除項目

int M = lstMain.getSelectedIndex(); 
LISTMODEL.remove(M); 

奇怪的事情發生。有時列表項被刪除,只剩下一個項目。這是我所期望的。有時列表項目似乎保持不變,但最後一項無法訪問。如果我點擊一個可訪問的項目,它會改變我的預期 - 即下一個項目是什麼。有時項目確實發生了變化,但最後一項仍然無法訪問。這似乎與Visual Basic列表框的易用性相差甚遠。誰能告訴我發生了什麼事?

+2

請仔細閱讀[這](http://docs.oracle.com/javase /tutorial/uiswing/components/list.html)。 – mre 2012-02-27 14:15:44

+0

您是否嘗試過使列表無效? – devsnd 2012-02-27 14:15:47

+2

由於您是Java新手,請閱讀http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367。這是非常推薦的。 – user219882 2012-02-27 14:17:12

回答

0

確保您對listModel所做的更改發生在事件調度線程(EDT)中。

具體而言,使用此:

SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      int M = lstMain.getSelectedIndex(); 
      LISTMODEL.remove(M); 
     } 
    }); 
+2

是的 - 雖然如果您從JButton觸發remove(),例如,那麼您已經在EDT中,所以invokeLater()不會是需要。 – DNA 2012-02-27 14:24:24

+0

請學習java命名約定並堅持使用它們(konnte ich mir jetzt nicht verkneifen aka SCNR :-) – kleopatra 2012-02-27 14:25:18

+0

@kleopatra Steve引用了OP的代碼,所以這有點苛刻! – DNA 2012-02-27 14:39:41

2

工作正常 - 試試這個SSCCE:

public class SimpleList 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("List example"); 
     final DefaultListModel model = new DefaultListModel(); 
     model.addElement("Hello"); 
     model.addElement("World"); 

     final JList list = new JList(model); 
     frame.add(list, BorderLayout.CENTER); 

     JButton remove = new JButton("Remove"); 
     remove.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       int sel = list.getSelectedIndex(); 
       if (sel >= 0) 
       { 
        model.removeElementAt(sel); 
       } 
      } 
     }); 

     frame.add(remove, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
}