JList — динамическое добавление и удаление элементов списка

JList - динамическое добавление и удаление элементов списка Разрабатывая приложения на Java иногда возникает необходимость динамически добавлять и удалять элементы списка JList. Давайте посмотрим, как это сделать. Начнем с того, что есть такая парадигма программирования Модель-Вид-Контроллер. Если коротко, то она позволяет не сваливать весь код приложения в кучу, а разделять его на три большие блока. Модель — занимается обработкой данных и всё, что с ними связано. Вид — внешность приложения. Определяет то, как будет выглядеть приложение и что собственно будет отображаться пользователю. Вид показывает данные, которые ему предоставляет модель. Контроллер — обработка всего, что приходит от пользователя. Все компоненты Swing укладываются в эту парадигму (по крайней мере стараются её придерживаться). Возьмем например компонент JList, который отображает данные в виде списка. Модель здесь — сущность которая хранит список значений и предоставляет методы для получения этого списка и его изменения. Вид — то, что занимается отрисовкой JList, именно вид определяет то, каким мы видим компонент. Контроллер — слушатели, которые мы вешаем на компонент, если хотим иметь возможность каким-то образом отвечать или реагировать на действия пользователя. Так к чему это я всё? А вот к чему. Сделать нужно динамическое добавление и удаление элементов списка. Так как данными заведует модель списка, то и все модификации будем производить через неё. Вообще модель по сути это некий интерфейс с методами, который нужно реализовать. В Swing есть и дефолтовая реализация модели списка и называется она DefaultListModel, который мы и будем использовать.

Как же использовать модель DefaultListModel списка JList? Для начала необходимо создать конкретный экземпляр модели и при создании нового списка JList подсунуть ему ссылку на эту модель. Вот так:

DefaultListModel listModel = new DefaultListModel();
JList list = new JList(listModel);

Модель создана. Далее нам потребуется каким-то образом добавлять и удалять элементы списка. Делать это будем через модель при помощи следующих методов класса DefaultListModel. Метод addElement добавляет новый элемент списка. К примеру, хотим добавить элементов к списку, то делаем вот так:

for (int i = 0; i < 25; i++) {
	listModel.addElement("Элемент списка " + i);
}

Здесь мы пробегаемся в цикле таким образом, что в модель добавляется 25 новых элементов. Как только произошел вызов addElement, новый элемент сразу же оказывается в списке JList. Идем дальше. Добавлять новые элементы к списку JList научились. Как быть с удалением? Удаляем аналогичным образом. Берем модель и вызываем метод remove. В качестве параметра методу передается индекс удаляемого элемента.

int removeIndex = 5;
listModel.remove(removeIndex);

Осталось посмотреть тестовый пример, чтобы увидеть всё вышеописанное в работе.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class TestFrame extends JFrame {

	private int i = 0;

	public TestFrame() {
		super("Тестовое окно");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JPanel mainPanel = new JPanel();
		mainPanel.setLayout(new BorderLayout(5, 5));
		mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

		final DefaultListModel listModel = new DefaultListModel();

		for (i = 0; i < 25; i++) {
			listModel.addElement("Элемент списка " + i);
		}

		final JList list = new JList(listModel);
		list.setSelectedIndex(0);
		list.setFocusable(false);
		mainPanel.add(new JScrollPane(list), BorderLayout.CENTER);

		JPanel buttonsPanel = new JPanel();
		buttonsPanel.setLayout(new GridLayout(1, 2, 5, 0));
		mainPanel.add(buttonsPanel, BorderLayout.SOUTH);

		JButton addButton = new JButton("Добавить");
		addButton.setFocusable(false);
		addButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String element = "Элемент списка " + i++;
				listModel.addElement(element);
				int index = listModel.size() - 1;
				list.setSelectedIndex(index);
				list.ensureIndexIsVisible(index);
			}
		});
		buttonsPanel.add(addButton);

		final JButton removeButton = new JButton("Удалить");
		removeButton.setFocusable(false);
		removeButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				listModel.remove(list.getSelectedIndex());
			}
		});
		buttonsPanel.add(removeButton);

		list.addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				if (list.getSelectedIndex() >= 0) {
					removeButton.setEnabled(true);
				} else {
					removeButton.setEnabled(false);
				}
			}
		});

		getContentPane().add(mainPanel);

		setPreferredSize(new Dimension(260, 220));
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}

	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame.setDefaultLookAndFeelDecorated(true);
				new TestFrame();
			}
		});
	}
}
Advertisements

5 Responses to JList — динамическое добавление и удаление элементов списка

  1. Andrei says:

    как сделать то же самое но место текста добавить готовые панели ?

  2. Mistler says:

    It is unsafe to keep your DefaultListModel and your JList untyped so its preferable to make it in this way:
    DefaultListModel listModel = new DefaultListModel();
    JList list = new JList(listModel);

  3. Alex says:

    Можете добавить подробные комментарии к программе

  4. Alex says:

    String element = «Элемент списка » + i++;
    listModel.addElement(element);
    int index = listModel.size() — 1;
    list.setSelectedIndex(index);
    list.ensureIndexIsVisible(index);
    вот этот кусок неясен просветите построчно что происходит с кодом

  5. Alex says:

    а не норм понял)

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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