Есть ли способ в Java, чтобы получить JList
если мы знаем ListSelectionModel
? Ниже приведен код из ListSelectionListener
:
ListSelectionModel lsm=(ListSelectionModel)event.getSource();
JList jl=lsm.someMethodIdLiketoKnow();
ListSelectionListener
добавляется в этот ListSelectionModel
:
myjlist.getSelectionModel().addListSelectionListener(myListSelectionListener);
Другой вопрос: почему бы мне просто не добавить слушателя непосредственно в JList
и вообще забыть о ListSelectionModel
?
Невозможно получить " JList
из данной ListSelectionModel
, потому что может быть несколько списков, которые имеют один и тот же 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). Но как указал иза в своем ответе: вы также можете добавить слушателя выбора в 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();
...
}
});
Вы можете добавить 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);
}
});