Метод, чтобы получить JList из его ListSelectionModel

1

Есть ли способ в Java, чтобы получить JList если мы знаем ListSelectionModel? Ниже приведен код из ListSelectionListener:

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

    JList jl=lsm.someMethodIdLiketoKnow();

ListSelectionListener добавляется в этот ListSelectionModel:

    myjlist.getSelectionModel().addListSelectionListener(myListSelectionListener);

Другой вопрос: почему бы мне просто не добавить слушателя непосредственно в JList и вообще забыть о ListSelectionModel?

Теги:
swing
jlist

2 ответа

2
Лучший ответ

Невозможно получить " 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();
        ...
    }
});
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);
    }
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню