2011-04-25 2 views
2

에는, DefaultListModel가 아니고 ListModel가 사용되고 있습니다. 이 유형을 여러 곳에서 사용하기 때문에 유형을 변경하고 싶지 않습니다. 같은 목록에서 선택한 항목을 제거하고 싶습니다. 어떻게해야합니까? 다음 코드를 사용하고 있지만 나를 위해 작동하지 않습니다.ListModel을 모델 타입으로 사용하고있는 JList로부터 항목을 삭제하는 경우

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

그리고 다음 JButton 마우스 클릭 이벤트, 나는 다음과 같은 코드를 사용하고 : 내 목록을 만들 때 다음과 같은 코드를 사용하고

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

--EDIT--

버튼을 눌렀을 때 목록에서 선택한 항목을 제거합니다.

+0

미안하지만 NetBeans를 사용하여 패널에 목록 구성 요소를 그립니다. 내가 getModel()을 사용했을 때 [email protected]을 얻었고 DefaultListModel로 타입 변환하려고했을 때 스레드 "AWT-EventQueue-0"에서 Exception 오류가 발생했습니다 java.lang.ClassCastException : javax.swing .JList $ 4는 javax.swing.DefaultListModel에 캐스트 할 수 없습니다. – Deepak

+0

재 포맷 된 코드; 복사; 잘못된 경우 되돌려주십시오. 'DefaultListModel'을 사용하지 않을 경우'ClassCastException'이 의미가 있습니다. 이를 사용자 정의 모델로 캐스팅 할 수 있어야합니다. – trashgod

+0

내 버전의 SSCCE를 포함하여 마지막 답변에 대한 편집을 참조하십시오. –

답변

6

removeSelection 간격은 선택 간격을 제외하고 모델 또는 목록에서 아무 것도 제거하지 않습니다. 목록 항목은 상처가 남지 않습니다. 나는 ListModel을 확장하고 removeItem (...) 메서드를 제공 할뿐만 아니라 청취자와 알리미를 발생시키는 등의 기능을 제공해야한다. AbstractListModel - 꽤 많이 일의! 내 돈이라면 쉬운 방법을 택하고 DefaultListModel을 모델에 사용하면 훨씬 쉽고 많은 시간을 절약 할 수 있기 때문에 훨씬 안전합니다. 나는 당신이 당신이 이것을 사용하고 싶지 않다고 말하지만 당신이 당신의 잠재적 인 대안보다 훨씬 쉽게 찾을 것이라고 생각합니다.

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

+0

스레드 "AWT-EventQueue-0"예외 java.lang.ClassCastException : javax.swing.JList $ 4를 javax.swing.DefaultListModel로 캐스팅 할 수 없음 – Deepak

+0

@Deepak : 더 많이 보자. 이 스레드에서 원래 게시물의 수정으로 문제가되는 코드를 DefaultListModel 객체를 사용하여 목록의 모델을 설정하는 위치와이 모델에 액세스하여 메소드를 호출하려는 위치를 알려주는 것이 좋습니다. DefaultListModel 모델이 아닌 JList를 캐스팅하려는 것처럼 보입니다.하지만 코드를 볼 때 수행중인 작업을 확실히 알 수 있습니다. –

3

당신은 문제를 해결하기 위해 과거에 스윙 튜토리얼의 다른 섹션에 대한 링크를 제공했습니다 :

SSCCE의 예는이 같은 것입니다. 이것은 이유가있다. 현재 문제를 해결하는 데 도움이됩니다. 그것은 미래의 문제에 대한 참조를 제공합니다.

스윙 튜토리얼의 목차를보고 목록에서 항목을 추가/제거하는 작동 예제가있는 "목록 사용 방법"절을 참조하십시오. 먼저 튜토리얼을 읽으십시오.

스윙 튜토리얼을 찾는 방법을 기억하지 못하면 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