2011-04-25 25 views
2

我有JList它使用ListModel而不是DefaultListModel。我現在不想改變這種類型,因爲我在很多地方都使用它。我想從同一個列表中刪除一個選定的項目。我該怎麼做呢?我正在使用下面的代碼,但它不適合我。使用ListModel作爲模型類型從JList中刪除一個項目

made_list.removeSelectionInterval(
    made_list.getSelectedIndex(), made_list.getSelectedIndex()); 

- 編輯 -

我使用下面的代碼,當我創建我的列表:

made_list = new javax.swing.JList(); 
made_list.setModel(new DefaultListModel()); 

然後在JButton鼠標點擊事件,我使用下面的代碼當按下按鈕時,從列表中刪除所選項目

private void removeActionPerformed(java.awt.event.ActionEvent evt) {          
    //made_list.removeSelectionInterval(made_list.getSelectedIndex(), 
    //made_list.getSelectedIndex()); 
    System.out.println(made_list.getModel()); 
    DefaultListModel model = (DefaultListModel)made_list.getModel(); 
    model.remove(1); 
} 
+0

我很抱歉,但我使用NetBeans繪製列表組件到面板上。當我使用getModel()我得到[email protected],當我試圖將它轉換爲DefaultListModel我收到線程「AWT-EventQueue-0」中的錯誤異常java.lang.ClassCastException:javax.swing .JList $ 4不能轉換爲javax.swing.DefaultListModel – Deepak 2011-04-25 04:07:10

+0

重新格式化的代碼;編輯修改的;如果不正確請回復。如果你不使用'DefaultListModel',那麼'ClassCastException'是有道理的。您應該可以將其轉換爲您的自定義模型。 – trashgod 2011-04-25 04:44:44

+0

請參閱我最後回答的編輯,包括我的SSCCE版本。 – 2011-04-25 04:48:26

回答

6

removeSelection除選擇間隔外,間隔不會從模型或列表中刪除任何內容。列表項目保持不變。恐怕你要麼擴展你的ListModel,並給它一個removeItem(...)方法,以及偵聽器和能夠觸發通知等等...... a AbstractListModel - 相當多工作的!不過,如果這是我的錢,我會走簡單的路線,並簡單地爲我的模型使用DefaultListModel,因爲這樣做更安全,更容易,而且花費的時間也更少。我知道你說你不想使用這些,但我認爲你會發現它比你的潛在替代品容易得多。

SSCCE的一個例子是這樣的:

import java.awt.event.*; 
import javax.swing.*; 

public class Foo1 { 
    private String[] elements = {"Monday", "Tueday", "Wednesday"}; 
    private javax.swing.JList made_list = new javax.swing.JList(); 

    public Foo1() { 
     made_list.setModel(new DefaultListModel()); 
     for (String element : elements) { 
     ((DefaultListModel) made_list.getModel()).addElement(element); 
     } 

     JButton removeItemBtn = new JButton("Remove Item"); 
     removeItemBtn.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      removeActionPerformed(e); 
     } 
     }); 

     JPanel panel = new JPanel(); 
     panel.add(new JScrollPane(made_list)); 
     panel.add(removeItemBtn); 

     JOptionPane.showMessageDialog(null, panel); 
    } 

    private void removeActionPerformed(ActionEvent e) { 
     System.out.println("made_list's model: " + made_list.getModel()); 
     System.out.println("Model from a fresh JList: " + new JList().getModel()); 
     DefaultListModel model = (DefaultListModel) made_list.getModel(); 
     if (model.size() > 0) { 
     model.remove(0); 
     } 
    } 

    public static void main(String[] args) { 
     new Foo1(); 
    } 

} 
+0

我創建List作爲DefaultListModel,當我使用這個DefaultListModel模型=(DefaultListModel)made_list.getModel();訪問DefaultListModel的方法我得到錯誤 – Deepak 2011-04-25 04:20:45

+0

線程「AWT-EventQueue-0」中的異常java.lang.ClassCastException:javax.swing.JList $ 4不能轉換爲javax.swing.DefaultListModel – Deepak 2011-04-25 04:21:00

+0

@Deepak:讓我們看看更多作爲編輯您的原始帖子在這個線程中的有問題的代碼。我建議向我們展示您在哪裏設置列表模型與您的DefaultListModel對象,以及您嘗試訪問此模型並將其稱爲方法的位置。它看起來好像你試圖投射一個JList,而不是它的模型作爲一個DefaultListModel,但是當我們看到你的代碼時,我們會確定知道你在做什麼。現在 – 2011-04-25 04:22:36

3

你一直在考慮,在過去的鏈接Swing指南的不同部分,以幫助解決問題。這是有原因的。它有助於解決您當前的問題。它爲您提供未來問題的參考。

您只需查看Swing教程的目錄,即可找到「如何使用列表」一節,其中有一個工作示例,可以從列表中添加/刪除項目。請先閱讀教程。

或者,如果您不記得如何找到Swing教程,請閱讀JList API,您將在其中找到指向同一教程的鏈接。

0
//First added item into the list 
DefaultListModel dlm1=new DefaultListModel(); 

listLeft.setModel(dlm1); 

dlm1.addElement("A"); 
dlm1.addElement("B"); 
dlm1.addElement("C"); 

// Removeing element from list 
Object[] temp=listRight.getSelectedValues(); 
if(temp.length>0) 
{ 
for(int i=0;i<temp.length;i++) 
{ 

    dlm1.removeElement(temp[i]); 

} 
}     
+0

嘗試向您的代碼添加一些說明 - 這將有助於更好地理解此原因 – Nogard 2013-02-07 11:21:20

相關問題