Java: руководство для начинающих (ЛП) - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Как и с компонентом JButton, с компонентом JTextField связывается конкретная команда действия в виде символьной строки. По умолчанию она соответствует текущему содержимому поля ввода текста, хотя в таком значении используется редко. Чаще всего устанавливается фиксированное значение команды действия с помощью метода setActionCommand (), который объявляется следующим образом:void setActionCommand(String cmd)
Символьная трока, передаваемая в качестве параметра cmd, становится новой командой действия, а текст в поле ввода текста не меняется. Установленная символьная строка команды действия остается постоянной, независимо от того, какой именно текст вводится в поле ввода текста. Как правило, к явной установке команды действия прибегают для того, чтобы обеспечить распознавание поля ввода текста как источника, сформировавшего событие действия. Поступать подобным образом приходится в том случае, если в рамке окна находится несколько элементов управления, для которых определен общий обработчик событий. Установив команду действия, вы получаете в свое распоряжение удобное средство для различения компонентов. Если же вы не установите явно команду действия для поля ввода текста, то можете испытать затруднения при распознавании источника события, так как пользователь может ввести в поле произвольный текст, совпадающий с командой действия другого компонента.
Для того чтобы получить символьную строку, отображаемую в поле ввода текста, следует обратиться к экземпляру класса JTextField и вызвать метод getText (). Объявление этого метода приведено ниже.String getText()
Задать текст для компонента JTextField можно с помощью метода setText (), объявляемого следующим образом:void setText(String текст)
где текст — это символьная строка, размещаемая в поле ввода текста.
Ниже приведен пример программы, демонстрирующий применение компонента JTextField. В окне этой программы содержатся поле ввода текста, кнопка и две метки. Одна из меток подсказывает пользователю ввести текст в поле. Когда пользователь нажмет клавишу (при условии, что фокус ввода находится в поле ввода текста), введенные данные будут извлечены и отображены на второй метке. На кнопке отображается надпись Reverse (Обратить). При нажатии этой кнопки содержимое поля ввода текста преобразуется и заменяется на обратное. Окно, отображаемое на экране при выполнении данной программы, приведено на рис. 15.3.// Применение поля ввода текста.import java.awt.*;import java.awt.event.*;import javax.swing.*;class TFDemo implements ActionListener { JTextField jtf; JButton jbtnRev; JLabel jlabPrompt, jlabContents; TFDemo() { // создать новый контейнер JFrame JFrame jfrm = new JFrame("Use a Text Field"); // установить диспетчер компоновки FlowLayout jfrm.setLayout(new FlowLayout()); // задать исходные размеры рамки окна jfrm.setSize(240, 120); // завершить программу после закрытия окна jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Создание поля ввода текста шириной 10 символов. jtf = new JTextField(10); // Установка команды действия для поля ввода текста. jtf.setActionCommand("myTF"); // создать кнопку Reverse JButton jbtnRev = new JButton("Reverse") ; // Добавление приемников событий от поля ввода и кнопки. jtf.addActionListener(this); jbtnRev.addActionListener(this) ; // создать метки jlabPrompt = new JLabel("Enter text: "); jlabContents = new JLabel(""); // добавить компоненты на панели содержимого jfrm.add(jlabPrompt); jfrm.add(jtf); jfrm.add(jbtnRev); jfrm.add(jlabContents) ; // отобразить рамку окна jfrm.setVisible(true); } // Обработка событий от кнопки и поля ввода текста. public void actionPerformed(ActionEvent ae) { // Для определения компонента, сформировавшего событие, // используется команда действия. if(ae.getActionCommand().equals("Reverse")) { // Нажатие кнопки Reverse. String orgStr = jtf.getText(); String resStr = ""; // обратить символьную строку в поле ввода текста for(int i=orgStr.length()-1; i >=0; i—) resStr += orgStr.charAt(i); // сохранить обращенную строку в поле ввода текста jtf.setText(resStr); } else // Нажатие клавиши <Enter> в тот момент, когда фокус // ввода находится в поле ввода текста, jlabContents.setText("You pressed ENTER. Text is: " + jtf.getText()); } public static void main(String args[]) { // создать рамку окна в потоке диспетчеризации событий SwingUtilities.invokeLater(new Runnable() { public void run() { new TFDemo(); } }) ; }}
Рис. 15.3. Окно, отображаемое при выполнении программы TFDemo
Большая часть исходного кода приведенной выше программы вам уже знакома, но некоторые его фрагменты необходимо рассмотреть отдельно. Прежде всего обратите внимание на то, что с полем ввода текста связана команда действия "myTF". Такое связывание осуществляется в следующей строке кода:jtf.setActionCommand("myTF");
После выполнения этой строки кода символьная строка команды действия всегда принимает значение "myTF" независимо от того, какой именно текст введен в поле. Благодаря этому исключается ситуация, при которой команда действия, связанная с полем ввода текста, будет вступать в конфликт с командой действия, связанной с кнопкой Reverse. В методе actionPerformed () установленная команда действия используется для распознавания того компонента, который стал источником события. Если символьная строка команды действия принимает значение "Reverse", это может означать только одно: событие наступило в результате щелчка на кнопке Reverse. Иначе следует сделать вывод, что событие наступило в результате нажатия пользователем клавиши в тот момент, когда фокус ввода находился в поле ввода текста.
И наконец, обратите внимание на следующую строку кода в теле методаactionPerformed():jlabContents.setText("You pressed ENTER. Text is: " + jtf.getText());
Как пояснялось выше, при нажатии клавиши в тот момент, когда фокус ввода находился в поле ввода текста, формируется событие ActionEvent, которое пересылается всем зарегистрированным приемникам событий действия с помощью метода actionPerf ormed (). В программе TFDemo этот метод лишь вызывает метод getText (), извлекая текст, содержащийся в компоненте jtf (поле ввода текста). После этого текст отображается с помощью метки, на которую ссылается переменная j labContents.Создание флажков с помощью компонента JCheckBox
Если обычные кнопки используются чаще других элементов пользовательского интерфейса, то на втором месте по частоте употребления, безусловно, стоят флажки. В Swing эти элементы пользовательского интерфейса реализуются с помощью компонента типа JCheckBox. Класс JCheckBox является производным от классов AbstractButton и JToggleButton. Следовательно, флажок — это особая разновидность кнопки.
В классе JCheckBox определен ряд конструкторов. Один из них имеет следующий вид:JCheckBox(String str)
Он создает флажок с пояснительной надписью в виде символьной строки, передаваемой в качестве параметра str.
При установке или сбросе флажка формируется событие от элемента, представленное классом ItemEvent. Для обработки событий от элементов используются классы, реализующие интерфейс itemListener. В этом интерфейсе объявлен лишь один метод, itemStateChanged (), объявляемый следующим образом:void itemStateChanged(ItemEvent ie)
Здесь событие от элемента передается в качестве параметра ie.
Для того чтобы получить ссылку на элемент, состояние которого изменилось, следует вызвать метод get Item () для объекта ItemEvent. Ниже приведена общая форма объявления этого метода.Object getltem()
Возвращаемая этим методом ссылка должна быть приведена к типу оперируемого компонента, а в данном случае — к классу JCheckBox.
Текст, связанный с флажком, можно получить, вызвав метод getText (), а задать текст пояснительной надписи, вызвав метод setText (). Эти методы действуют таким же образом, как и одноименные методы из рассмотренного ранее класса JButton.