Java: руководство для начинающих (ЛП) - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Самый простой способ определить состояние флажка — вызвать метод isSelected (), который объявляется следующим образом:boolean isSelected()
Этот метод возвращает логическое значение true, если флажок установлен, иначе — логическое значение false.
Ниже приведен пример программы, демонстрирующий манипулирование флажками. В ней создаются три флажка: Alpha, Beta и Gamma. Всякий раз, когда состояние флажка изменяется, в окне программы появляются сведения о произведенном действии, а также перечисляются те флажки, которые установлены в данный момент. Окно, отображаемое на экране при выполнении данной программы, приведено на рис. 15.4.// Демонстрация флажков.import java.awt.*;import java.awt.event.*;import javax.swing.*;class CBDemo implements ItemListener { JLabel jlabSelected; JLabel jlabChanged; JCheckBox jcbAlpha; JCheckBox jcbBeta; JCheckBox jcbGamma; CBDemo() { // создать новый контейнер JFrame JFrame jfrm = new JFrame("Demonstrate Check Boxes"); // установить диспетчер компоновки FlowLayout jfrm.setLayout(new FlowLayout()); // задать исходные размеры рамки окна jfrm.setSize(280, 120); // завершить программу после закрытия окна jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // создать пустые метки jlabSelected = new JLabel(""); jlabChanged = new JLabel(""); // Создание флажков. jcbAlpha = new JCheckBox("Alpha"); jcbBeta = new JCheckBox("Beta"); jcbGamma = new JCheckBox("Gamma"); // События, формируемые компонентами JCheckBox, обрабатываются // одним методом itemStateChanged(), реализованным в классе CBDemo. jcbAlpha.addltemListener(this); jcbBeta.addltemListener(this) ; jcbGamma.addltemListener(this); // добавить флажки и метки на панели содержимого jfrm.add(jcbAlpha); jfrm.add(jcbBeta); jfrm.add(jcbGamma); jfrm.add(jlabChanged); jfrm.add(jlabSelected); // отобразить рамку окна jfrm.setVisible(true); } // Обработчик событий от элементов (в данном случае — флажков). public void itemStateChanged(ItemEvent ie) { String str = ""; // Получение ссылки на компонент флажка, сформировавший событие. JCheckBox cb = (JCheckBox) ie.getltem(); // сообщить об изменении состояния флажка if(cb.isSelected()) // Определение состояния флажка. jlabChanged.setText(cb.getText() + " was just selected."); else jlabChanged.setText(cb.getText() + " was just cleared."); // сообщить о всех установленных флажках if(jcbAlpha.isSelected()) { str += "Alpha "; } if(jcbBeta.isSelected()) { str += "Beta "; } if (jcbGamma.isSelected() ) { str += "Gamma"; } jlabSelected.setText("Selected check boxes: " + str); } public static void main(String args[]) { // создать рамку окна в потоке диспетчеризации событий SwingUtilities.invokeLater(new Runnable() { public void run() { new CBDemo(); } }); }}
Рис. 15.4. Окно, отображаемое при выполнении программы CBDemo
Наибольший интерес в рассматриваемом здесь примере представляет метод itemStateChanged (), предназначенный для обработки событий от элементов (в данном случае — флажков). Он выполняет две функции: во-первых, сообщает, установлен или сброшен флажок; а во-вторых, отображает перечень установленных флажков. В начале этого метода определяется ссылка на компонент, сформировавший событие ItemEvent. Это происходит в следующей строке кода:JCheckBox cb = (JCheckBox) ie.getltem();
Приведение к типу JCheckBox необходимо потому, что метод getltem () возвращает ссылку на объект типа Object. Далее метод itemStateChanged () обращается к методу isSelected () по ссылке cb, чтобы определить текущее состояние флажка. Если метод isSelected () возвращает логическое значение true, значит, флажок установлен, а логическое значение false соответствует сброшенному состоянию флажка. Затем с помощью метки j labChanged отображаются сведения о выполненном действии.
И наконец, метод itemStateChanged () проверяет состояние каждого флажкаи формирует символьную строку с именами установленных флажков. Эта символьнаястрока отображается в окне программы с помощью метки j labSelected.Работа с компонентом Jlist
Последним в этой главе будет рассмотрен компонент JList. Он является основным классом Swing для работы со списками и позволяет выбирать один или несколько элементов из списка. И хотя элементы списка являются символьными строками, это не мешает создать список, включающий практически любые объекты, которые могут быть отображены на экране. Компонент JList настолько широко применяется в реальных программах на Java, что его трудно было бы не заметить в них прежде.
Раньше элементы списка были представлены в компоненте JList в виде ссылок на объекты типа Object. А после выпуска версии JDK 7 компонент JList стал обобщенным и теперь объявляется следующим образом:class JList<E>
где Е обозначает тип элементов списка. Таким образом, в компоненте JList теперь обеспечивается типовая безопасность.
На заметкуДалее рассматривается обобщенный вариант компонента JList и демонстрируется пример его применения. Поэтому если вы пользуетесь компилятором более ранней версии, чем JDK 7, вам придется выбрать предыдущий, необобщенный вариант компонента JList.
В классе компонента JList предоставляется ряд конструкторов. Один из них имеет следующий вид:JList (Е[] элементы)
Этот конструктор создает компонент JList со списком элементов, хранящихся в массиве, на который указывает параметр элементы.
Компонент JList и сам позволяет решить немало задач построения списков, но чаще всего он помещается в контейнер JScrollPane, автоматически обеспечивающий прокрутку своего содержимого. Ниже приведен конструктор этого контейнера.JScrollPane(Component компонент)
Здесь компонент обозначает конкретный компонент, передаваемый конструктору в качестве параметра для прокрутки (в данном случае это компонент JList). Если поместить компонент JList в контейнер JScrollPane, то тем самым будет обеспечена автоматическая прокрутка длинных списков. Благодаря этому упрощается построение графического пользовательского интерфейса вообще и изменение числа элементов списка в частности, не затрагивая при этом размеры самого компонента JList.
Когда пользователь делает или изменяет выбор элемента в списке, компонент JList формирует событие ListSelectionEvent. Это же событие формируется при отмене выбора. Для его обработки используется объект приемника событий из класса, реализующего интерфейс ListSelectionListener. Этот интерфейс относится к пакету javax. swing. event. В этом интерфейсе объявлен только один метод, valueChanged (), объявляемый следующим образом:void valueChanged(ListSelectionEvent le)
где Ie обозначает ссылку на объект, сформировавший событие. И хотя в самом классе ListSelectionEvent определен ряд методов, для выяснения того, что же произошло со списком, обычно приходится опрашивать сам объект типа JList. Класс ListSelectionEvent также относится к пакету j avax. swing. event.
По умолчанию компонент JList дает пользователю возможность выбрать несколько элементов из списка. Изменить такое поведение можно, вызвав метод setSelectionMode (), определенный в классе JList. Этот метод объявляется так:void setSelectionMode(int режим)
где параметр режим задает порядок выбора элементов из списка. Значение этого параметра должно совпадать с одной из приведенных ниже констант, определенных в интерфейсе ListSelectionModel, входящем в пакет javax. swing.SINGLE_SELECTIONSINGLE_INTERVAL_SELECTIONMULTIPLE_INTERVAL_SELECTION
По умолчанию устанавливается режим MULTIPLE_INTERVAL_SELECTION, и пользователь может выбирать ряд элементов из списка через несколько промежутков. В режиме SINGLE_INTERVAL_SELECTI0N можно выбирать ряд элементов из списка только через один промежуток. А в режиме SINGLE SELECTION каждый раз можно выбрать только один элемент из списка. Очевидно, что единственный элемент может быть выбран из списка и в двух других режимах, где допускается также выбирать одновременно целый ряд элементов.