JList – выделение элементов списка. Часть 2

В предыдущей части говорилось о том, какие есть режимы выделения элементов у компонента списка JList и как установить выбранный режим. Следующая задача – определить, что пользователь выбрал какой-то элемент или несколько элементов в списке. Как в случае и с другими компонентами, как только пользователь выбрал элемент списка JList система сразу создает соответствующее событие и оповещает всех заинтересованных слушателей о его наступлении. Посмотрим, как повесить слушателя на событие выделения элементов в списке JList.

Давайте посмотрим, что за слушатель такой, которого нужно добавить. Слушатель этот должен реализовать интерфейс javax.swing.event.ListSelectionListener, который имеет всего один метод handleEvent. При вызове ему передается событие, из которого можно узнать индексы элементов списка.

Как только интерфейс реализован и слушатель готов, нужно его добавить в правильное место. Для этого у Jlist есть метод addListSelectionListener, которому требуется передать ссылку на свежеиспеченого слушателя, у которого в методе handleEvent содержится код, который должен будет выполняться при срабатывании события.

В приведенном ниже фрагменте кода добавляется анонимный слушатель слушатель к компоненту списку JList. Иногда бывает удобно написать анонимного обработчика события, а иногда вынести в отдельный класс.

list.addListSelectionListener(
                    new ListSelectionListener() {
                         public void valueChanged(ListSelectionEvent e) {
                              Object element = list.getSelectedValue();
                              label.setText(element.toString());
                         }
                    });

Напоследок тестовое приложение, которое состоит из списка JList и текстовой метки JLabel. Как только пользователь выбирает какой-то элемент в списке это сразу же отображается в текстовой метке внизу списка.

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class TestFrame extends JFrame {

     public TestFrame() {
          super("Test frame");
          createGUI();
     }

     public void createGUI() {
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          JPanel panel = new JPanel();
          panel.setLayout(new BorderLayout());

          String[] data = { "Windows XP", "Windows Vista", "Mac OS",
                    "Chrome OS", "Ubuntu", "Linux", "Unix", "Solaris",
                    "Windows 98", "Windows 95", "Windows 2000",
                    "Windows 2003" };

          final JList list = new JList(data);
          list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

          panel.add(new JScrollPane(list), BorderLayout.CENTER);

          final JLabel label = new JLabel(" ");

          panel.add(label, BorderLayout.SOUTH);

          list.addListSelectionListener(
                    new ListSelectionListener() {
                         public void valueChanged(ListSelectionEvent e) {
                              Object element = list.getSelectedValue();
                              label.setText(element.toString());
                         }
                    });

          getContentPane().add(panel);

          setPreferredSize(new Dimension(250, 200));
     }

     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    JFrame.setDefaultLookAndFeelDecorated(true);
                    TestFrame frame = new TestFrame();
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
               }
          });
     }
}

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: