Чтение онлайн

ЖАНРЫ

Java: руководство для начинающих
Шрифт:

Ниже приведен пример программы, демонстрирующий применение кнопки, реагирующей на действия пользователя. А на рис. 15.2 показано окно, отображаемое данной программой на экране. // Демонстрация нажатия кнопки и обработки событий действия. import java.awt.*; import java.awt.event.*; import javax.swing.*; class ButtonDemo implements ActionListener { JLabel jlab; ButtonDemo { // создать новый контейнер JFrame JFrame jfrm = new JFrame("A Button Example"); // установить диспетчер компоновки FlowLayout jfrm.setLayout(new FlowLayout); // задать исходные размеры рамки окна < jfrm.setSize(220, 90); // завершить программу после закрытия окна jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Создание двух кнопок. JButton jbtnUp = new JButton("Up"); JButton jbtnDown = new JButton("Down"); // Добавление приемников событий от кнопки. jbtnUp.addActionListener(this); jbtnDown.addActionListener(this) ; // Добавление кнопок на панели содержимого. jfrm.add(jbtnUp); jfrm.add(jbtnDown); // создать

метку jlab = new JLabel("Press a button."); // добавить метку в рамке окна jfrm.add(jlab); // отобразить рамку окна jfrm.setVisible(true); } // Обработка событий от кнопки. public void actionPerformed(ActionEvent ae) { // Для определения нажатой кнопки используется команда действия. if(ae.getActionCommand.equals("Up")) jlab.setText("You pressed Up."); else jlab.setText("You pressed down. "); } public static void main(String args[]) { // создать рамку окна в потоке диспетчеризации событий SwingUtilities.invokeLater(new Runnable { public 'void run { new ButtonDemoO; } }) ; } }

Рис. 15.2. Окно, отображаемое при выполнении программы ButtonDemo

Проанализируем приведенную выше программу, обратив внимание на новые и рассматривавшиеся до сих пор компоненты. Сначала в этой программе импортируются пакеты j ava. awt и j ava. awt. event. Пакет j ava. awt необходим, поскольку он содержит класс диспетчера компоновки FlowLayout, а пакет j ava. awt. event — потому, что в нем определены интерфейс ActionListener и класс ActionEvent.

Далее в программе объявляется класс ButtonDemo, который реализует интерфейс ActionListener. Это означает, что объекты типа ButtonDemo могут быть использованы для приема и обработки событий действия. Затем объявляется ссылка на объект типа JLabel. Она будет использована в методе actionPerf ormed для отображения сведений о том, какая именно кнопка была нажата.

Конструктор класса ButtonDemo начинается с создания контейнера jfrm типа JFrame. Затем в качестве диспетчера компоновки для панели содержимого контейнера jfrm устанавливается FlowLayout, как показано ниже, j frm.setLayout(new FlowLayout);

Как пояснялось ранее, по умолчанию на панели содержимого в качестве диспетчера компоновки используется BorderLayout, но для многих приложений лучше подходит диспетчер компоновки FlowLayout. Он размещает компоненты построчно: слева направо и сверху вниз. После заполнения текущей строки этот диспетчер компоновки переходит к следующей строке. Такая компоновка предоставляет лишь ограниченный контроль над расположением компонентов, хотя и проста в употреблении. Но следует иметь в виду, что при изменении размеров контейнера расположение компонентов может измениться.

После установки размеров рамки окна и определения операции, завершающей программу, в конструкторе ButtonDemo создаются две кнопки: JButton jbtnUp = new JButton("Up"); JButton jbtnDown = new JButton("Down");

На первой кнопке отображается надпись Up (Нажато), а на второй — Down (Отпущено).

Далее с кнопками связывается приемник событий действия, в роли которого выступает экземпляр класса ButtonDemo, а ссылка на него передается с помощью ключевого слова this. Соответствующие строки кода приведены ниже. jbtnUp.addActionListener(this) ; jbtnDown.addActionListener(this) ;

В результате выполнения этих строк кода объект, создающий кнопки, будет также получать уведомление об их нажатии.

Всякий раз, когда кнопка нажимается, формируется событие, о котором зарегистрированные приемники уведомляются в результате вызова метода actionPerformed. Объект типа ActionEvent, представляющий событие от кнопки, передается этому методу в качестве параметра. В программе ButtonDemo это событие передается следующей реализации метода actionPerformed: // Обработка событий от кнопки. public void actionPerformed(ActionEvent ae) { if(ae.getActionCommand.equals("Up")) jlab.setText("You pressed Up."); else jlab.setText("You pressed down. "); }

Для передачи события служит параметр ае. В теле метода извлекается команда действия, которая соответствует кнопке, сформировавшей событие. Для получения команды действия вызывается метод getActionCommand . (Напомним: по умолчанию команда действия совпадает с текстом, отображаемым на кнопке.) В зависимости от содержания символьной строки, представляющей команду действия, устанавливается текст надписи на кнопке, указывающий на то, какая именно кнопка была нажата.

Следует также иметь в виду, что метод actionPerformed вызывается в потоке диспетчеризации событий. Он должен завершаться как можно быстрее, чтобы не замедлять работу приложения. Работа с компонентом JTextField

К числу широко используемых компонентов Swing относится также компонент JTextField, который дает пользователю возможность вводить и редактировать текстовую строку. Компонент JTextField является подклассом, производным от абстрактного класса JTextComponent, который выступает в роли суперкласса не только для компонента JTextField, но и для всех текстовых компонентов вообще. В классе JTextField определен ряд конструкторов.

Здесь и далее будет использоваться следующий конструктор: JTextField(int cols)

где cols обозначает ширину текстового поля, выраженную в столбцах. Однако длина вводимой строки не ограничивается шириной поля, отображаемого на экране. Поэтому, если в конструкторе присутствует параметр cols, он задает лишь упомянутый выше физический размер компонента.

Для завершения ввода текста в поле пользователь нажимает клавишу , в результате чего формируется событие ActionEvent. В классе JTextField предоставляются методы addActionListener и removeActionListener . Для обработки событий действия необходимо реализовать метод actionPerformed , объявленный в интерфейсе ActionListener. Обработка событий от поля ввода текста осуществляется таким же образом, как и обработка событий от кнопки, о которых шла речь ранее.

Как и с компонентом 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; } }) ; } }

Поделиться с друзьями: