2014-09-02 3 views
1

를 알고있는 경우, Java로는, JList의 메소드가 존재합니까? 아래의 코드에서하는 내 ListSelectionListener :ListSelectionModel로부터 JList를 취득하는 메소드

ListSelectionModel lsm=(ListSelectionModel)event.getSource(); 

    JList jl=lsm.someMethodIdLiketoKnow(); 

ListSelectionListener가에 추가이 ListSelectionModel : 난 그냥 직접 JList에 리스너를 추가하고 잊지 이유

myjlist.getSelectionModel().addListSelectionListener(myListSelectionListener); 

다른 질문은 모두 ListSelectionModel에 대해?

답변

2

여러리스트가있을 수 있기 때문에하기, ListSelectionModel 주어진 행의 ""JList를 얻을 수 없을 수 final 로컬 변수 익명 클래스로부터 액세스 할 수 있기 때문에,이 예에서는 단순히 availabe이다 이 가지고있는 같은ListSelectionModel :

import java.awt.BorderLayout; 
import java.awt.GridLayout; 

import javax.swing.DefaultListModel; 
import javax.swing.DefaultListSelectionModel; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.ListSelectionModel; 
import javax.swing.SwingUtilities; 

public class SharedListSelectionModel 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.getContentPane().setLayout(new BorderLayout()); 

     DefaultListModel modelA = new DefaultListModel(); 
     JList listA = new JList(modelA); 
     DefaultListModel modelB = new DefaultListModel(); 
     JList listB = new JList(modelB); 
     for (int i=0; i<10; i++) 
     { 
      modelA.addElement("A"+i); 
      modelB.addElement("B"+i); 
     } 

     ListSelectionModel selectionModel = new DefaultListSelectionModel(); 
     listA.setSelectionModel(selectionModel); 
     listB.setSelectionModel(selectionModel); 

     JPanel p = new JPanel(new GridLayout(1,2)); 
     p.add(new JScrollPane(listA)); 
     p.add(new JScrollPane(listB)); 
     f.getContentPane().add(p, BorderLayout.CENTER); 

     f.setSize(300,300); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 

선택 모델이 m에, 약 (자체 모델이다 MVC pattern의 eaning). 그러나 icza는 대답에서 지적했다 : 선택 수신기를 JList에 추가 할 수도있다.

다른 해결책은 수동으로 수신기와 목록을 연결하는 것입니다. 흔히 익명의 내부 클래스에서 로컬로 수행 할 수 있습니다.

// Declare list as "final" (or make it a field of the enclosing class) 
final JList list = ...; 
list.getSelectionModel().addListSelectionListener(new ListSelectionListener() 
{ 
    @Override 
    public void valueChanged(ListSelectionEvent e) 
    { 
     // Can access the list here: 
     Object object = list.getSelectedValue(); 
     ... 
    } 
}); 
2

JListListSelectionModelListSelectionListener을 모두 추가 할 수 있습니다.

이벤트 소스는 수신기를 추가하는 객체이므로 JList에 추가하면 event.getSource()JList을 반환합니다. 수신기를 ListSelectionModel에 추가하면 event.getSource()ListSelectionModel을 반환합니다.

청취자를자신에 추가하면 JList 구현이 기본 모델의 "수신 대기"를 처리하고 등록한 수신기에 전달 될 새 이벤트를 변환/작성하고 원본이 올바르게 설정됩니다 JList.

여전히 모델에 리스너를 추가하려는 경우, 당신은 단지 소스로 ListSelectionModel를 저장하기 때문에 이벤트의 밖으로 JList "을 추출 할 수 없습니다"하고는 JList에 대해 알고하지 않습니다. 직접 참조를 관리해야합니다.

final JList<String> list = new JList<>(new String[]{"One", "Two"}); 
list.getSelectionModel().addListSelectionListener(new ListSelectionListener() { 
    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     // JList cannot be "extracted from the event 
     // But we know its reference, e.g. 
     System.out.println("JList is:" + list); 
    } 
});