2014-09-02 81 views
1

如果我們知道ListSelectionModel,Java中是否有獲得JList的方法?下面的代碼是從我ListSelectionListener從ListSelectionModel獲取JList的方法

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

    JList jl=lsm.someMethodIdLiketoKnow(); 

ListSelectionListener加入到這個ListSelectionModel

myjlist.getSelectionModel().addListSelectionListener(myListSelectionListener); 

的另一個問題是,我爲什麼不只是添加監聽到JList直接和忘記一共約ListSelectionModel

回答

2

它不可能是可能獲得從給定ListSelectionModel「的」 JList,因爲有可能是多個名單該具有相同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); 
    } 
} 

選擇模型是在其自己的(大致爲模型,在米傾向於MVC pattern)。但正如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

您可以將ListSelectionListener同時添加到JList本身及其ListSelectionModel

事件源將是您添加偵聽器的對象,因此如果將它添加到JList,event.getSource()將返回JList。如果將偵聽器添加到ListSelectionModel,則event.getSource()將返回ListSelectionModel

如果你把你的聽衆到JList本身,JList實現處理的基礎模型的「聽」,將翻譯/創建將被分派到您註冊偵聽新的事件,而源將被正確設置到JList

如果你仍然想的監聽器添加到模型中,你不能「提取」的JList出了大事,因爲它只會存儲ListSelectionModel作爲源,它不知道有關JList。你必須自己管理參考。在這個例子僅僅是不可得到的final局部變量可以從匿名類訪問:

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); 
    } 
});