Презентация по Программированию. Книга Программирование на Java для начинающих
Скачать 4.47 Mb.
|
setOpaque(). В пакете java.awt существует также класс Font, который можно ис- пользовать для изменения шрифта отображаемого текста. Конструк- тор объекта Font может принимать три аргумента, которые определя- ют имя, стиль и размер шрифта: • имя должно быть одним из трех платформонезависимых имен: Serif , SansSerif или Monospaced; • в качестве стиля должна выступать одна из этих трех констант: Font.PLAIN , Font.BOLD или Font.ITALIC; • размер должен быть целым числом, указывающим количество точек . 149 Для того чтобы изменить цвет шрифта любого из компонентов интер- фейса, существует метод setFont(), который принимает в качестве ар- гумента объект Font. 1. Отредактируйте копию файла Window.java, заменив имя класса Window в объявлении, в конструкторе и в экземпляре на Custom. 2. Добавьте оператор в самое начало программы для импортирова- ния функциональности всех классов пакета java.awt. import java.awt.* ; 3. Перед конструктором Custom() создайте три объекта JLabel. JLabel lbl1 = new JLabel( "Пользовательский задний фон" ) ; JLabel lbl2 = new JLabel( "Пользовательский передний фон" ) ; JLabel lbl3 = new JLabel( "Пользовательский шрифт" ) ; 4. Создайте объект Color Color customColor = new Color( 255 , 0 , 0 ) ; 5. Создайте объект Font Font customFont = new Font( "Serif" , Font.PLAIN , 32 ) ; 6. В конструкторе Custom() добавьте операторы для изменения цвета заднего фона объекта JLabel, используя константу Color. lbl1.setOpaque( true ) ; lbl1.setBackground( Color.YELLOW ) ; 7. Добавьте оператор для изменения цвета переднего плана объекта JLabel , используя пользовательский объект Color. lbl2.setForeground( customColor ) ; 8. Добавьте оператор для изменения текста на компоненте JLabel с использованием пользовательского шрифта. lbl3.setFont( customFont ) ; 9. Добавьте все метки на контейнер JPanel. pnl.add( lbl1 ) ; pnl.add( lbl2 ) ; pnl.add( lbl3 ) ; 10. Сохраните программу под именем Custom.java, затем скомпилируй- те и запустите для просмотра результата изменения компо нентов. JAVA Custom.java Совет В данном случае пользова- тельский цвет эквивалентен значению Color.RED, по- скольку здесь указывается максимальное значение для красного, а зеленый и синий цвета полностью отсутст- вуют. 8. Пос троение инт ерфейс ов 150 Размещение компонентов В пакете java.awt содержится набор классов для менеджера компонов- ки, которые можно использовать для размещения компонентов в кон- тейнере различными способами. Менеджер компоновки создается с использованием ключевого слова new и впоследствии может быть использован в качестве аргумента для конструктора JPanel, который будет указывать, чтобы панель исполь- зовала именно этот шаблон. При добавлении компонентов на панель они будут размещаться в соответствии с правилами указанного менед- жера шаблонов. Менеджер шаблонов Правила размещения компонентов BorderLayout Вверху, внизу, справа, слева и в цен- тре (используется по умолчанию) BoxLayout В одну строку или столбец CardLayout Поочередно в указанной области FlowLayout В строке слева направо с возмож- ностью переноса (используется по умолчанию для JPanel) GridBagLayout В сетке ячеек (могут их растягивать) GridLayout В таблице по строкам и столбцам GroupLayout Горизонтально и вертикально SpringLayout С привязкой к границам компонентов Объект верхнего уровня JFrame содержит контейнер, который раз- мещает компоненты, используя по умолчанию менеджер компоновки BorderLayout . На него можно помещать до пяти контейнеров JPanel, которые могут использовать свои менеджеры компоновки (по умолча- нию FlowLayout), представленные в таблице выше. Используя разно- образие менеджеров компоновки, можно добиться различных вариан- тов размещения компонентов. Контейнер content pane может быть представлен объектом java.awt. Container , чей метод add() может указывать позицию и имя помеща- емого в данный контейнер компонента. На заметку Каждый из менеджеров компоновки подробнее опи- сывается в разделе докумен- тации java.awt. 151 1. Отредактируйте копию файла Window.java, заменив объявление класса, конструктор и экземпляр Window на Layout, затем в начале программы добавьте оператор для импортирования функциональ- ности пакета java.awt. import java.awt.* ; 2. Перед конструктором Layout() создайте объект Container, пред- ставляющий собой контейнер JFrame. Container contentPane = getContentPane() ; 3. Создайте еще один объект JPanel, используя менеджер компонов- ки GridLayout в виде сетки 2 х 2. JPanel grid = new JPanel( new GridLayout( 2 , 2 ) ) ; 4. В конструкторе Layout() вставьте операторы, добавляющие ком- поненты JButton на оба объекта JPanel. pnl.add( new JButton( "Да" ) ) ; pnl.add( new JButton( "Нет" ) ) ; pnl.add( new JButton( "Отмена" ) ) ; grid.add( new JButton( "1" ) ) ; grid.add( new JButton( "2" ) ) ; grid.add( new JButton( "3" ) ) ; grid.add( new JButton( "4" ) ) ; 5. Теперь вставьте операторы, добавляющие обе панели и кнопку в контейнер contentPane. contentPane.add( "North" , pnl ) ; contentPane.add( "Center" , grid ) ; contentPane.add( "West" , new JButton( "Запад" ) ) ; 6. Сохраните программу под именем Layout.java, затем скомпилируй- те и запустите, чтобы увидеть размещение компонентов. JAVA Layout.java Внимание Если FlowLayout использует размер объекта JButton, то другие менеджеры компо- новки растягивают ком- поненты, чтобы заполнить пространство компоновки. 8. Пос троение инт ерфейс ов 152 Заключение • Для создания компонентов графического пользовательского интер- фейса используются классы библиотеки Java Swing, содержащиеся в пакете javax.swing. • Окно создается в виде контейнера верхнего уровня JFrame. • В конструкторе JFrame указывается заголовок окна, размер, опера- ция по умолчанию для закрытия и значение видимости. • Контейнер JPanel отображает более мелкие компоненты, исполь- зуя менеджер компоновки FlowLayout. • Конструктор JButton может определять текст и изображения, ко- торые должны быть отображены на компоненте «кнопка». • Изображения, используемые в программе, представляются объек- том ImageIcon. • Если программы должны быть распространены в виде отдельного Java-архива (JAR), то они должны использовать объект ClassLoader для указания исходного файла изображения. • Объект JLabel отображает неизменяемый текст и изображение. • Текст, который можно редактировать, отображается в полях JTextField и JTextArea. • Объект JScrollPane организует полосу прокрутки для поля JTextArea • При помощи компонентов JCheckBox, JComboBox и JList можно отображать элементы для выбора. • Компоненты JRadioButton логически группируются при помощи компонента JButtonGroup. • Класс Color пакета java.awt представляет компоненты RGB зеле- ного цвета. • Для создания объектов, представляющих определенное имя, стиль и размер шрифта, используется класс Font пакета java.awt. • При помощи класса Container пакета java.awt несколько контей- неров можно добавлять в контейнер JFrame. • При создании контейнера JPanel можно указывать менеджер ком- поновки. 9 9 Распознавание Распознавание событий событий В данной главе В данной главе демонстрируется, демонстрируется, как в Java-программах как в Java-программах создавать обработчики создавать обработчики событий, которые событий, которые реагируют на действия реагируют на действия пользователя. пользователя. • «Прослушивание» событий • «Прослушивание» событий • Генерация событий • Генерация событий • Обработка событий кнопок • Обработка событий кнопок • Обработка событий элементов • Обработка событий элементов • Реагирование на события клавиатуры • Реагирование на события клавиатуры • Ответ на события мыши • Ответ на события мыши • Вывод сообщений • Вывод сообщений • Запрос пользовательского ввода • Запрос пользовательского ввода • Проигрывание звука • Проигрывание звука • Заключение • Заключение 9. Р аспознавание с обытий 154 «Прослушивание» событий С программами, предлагающими графический интерфейс (GUI) поль- зователь может взаимодействовать, выполняя действия с мышью, кла- виатурой либо другими устройствами ввода. Действия пользователя вызывают «события», которые заставляют программу отвечать на них. Этот процесс называется «обработкой событий ». Для того чтобы программа могла распознавать события, вызванные действиями пользователя, в нее нужно добавить интерфейс «слушате- ля событий » — EventListener из пакета java.awt.event. Чтобы сде- лать его доступным в программе, нужно добавить в первоначальный оператор строку import java.awt.event.* ;. Для того чтобы включить интерфейс EventListener в объявление клас- са, нужно использовать ключевое слово implements. Например, объяв- ление класса для прослушивания событий кнопки мыши может выгля- деть следующим образом: class Click extends JFrame implements ActionListener { } Документация по Java описывает множество интерфейсов EventListener, которые могут «слушать» различные события, но наиболее распростра- ненные представлены в таблице ниже вместе с кратким их описанием. Слушатель события Описание ActionListener Распознает события действия, которые происходят при нажатии или освобожде- нии кнопки ItemListener Распознает события элемента, которые происходят при выборе элемента или отме- не выбора KeyListener Распознает события клавиатуры, которые происходят, когда пользователь нажимает или отпускает клавишу MouseListener Распознает события кнопок мыши, которые происходят, когда пользователь нажимает или отпускает кнопку мыши либо когда ука- затель мыши входит в область компонента или покидает ее MouseMotionListener Распознает события движения указателя мыши, которые происходят, когда пользо- ватель двигает мышью Совет После ключевого слова implements можно добавлять несколько слушателей, раз- деляя их запятой. 155 Генерация событий Для того чтобы интерфейс EventListener мог распознавать события, компоненты интерфейса должны их каким-либо образом генериро- вать. Если в программу добавлен какой-либо EventListener, как опи- сано выше, то в соответствующий компонент необходимо добавить генератор события. Например, для того, чтобы программа реагировала на нажатие кнопки, в нее добавляется интерфейс ActionListener и должен быть вызван метод кнопки addActionListener(), в качестве аргумента которому указывается ключевое слово this. Таким образом генерируется собы- тие при нажатии на данную кнопку, и это событие будет распознавать- ся интерфейсом ActionListener. Операторы, создающие кнопку, которая генерирует события, могут вы- глядеть следующим образом: JButton btn = new JButton( "Жми меня" ) ; btn.addActionListener( this ) ; Когда пользователь нажимает кнопку, которая генерирует событие, ин- терфейс ActionListener распознает данное событие и ищет метод об- работчика событий в программе для выполнения ответных действий. Каждый интерфейс EventListener имеет связанный с ним метод об- работчика событий, который вызывается, когда событие распознается. Например, когда нажимается кнопка, интерфейс ActionListener вы- зывает связанный метод с именем actionPerformed() и передает в ка- честве его аргумента объект ActionEvent. Объект ActionEvent содержит информацию о событии и компоненте- источнике, вызвавшем его. Существует полезный метод getSource(), который идентифицирует объект, вызвавший событие. Его можно ис- пользовать для создания соответствующего ответного действия для компонента. Метод обработчика события, создающий ответ на нажатие кнопки, мо- жет выглядеть приблизительно так: public void actionPerformed( ActionEvent event ) { if ( event.getSource() == btn ) { Операторы, которые будут выполняться по нажатию кнопки } } 9. Р аспознавание с обытий 156 Обработка событий кнопок Компонент JButton в библиотеке Swing генерирует событие ActionEvent , которое распознается интерфейсом ActionListener и передается методу-обработчику actionPerformed(). У объекта ActionEvent существует метод getSource(), который идентифициру- ет исходный компонент, являющийся инициатором события, а также метод getActionCommand(), возвращающий строковое значение. Оно может быть либо текстовой меткой для кнопки, либо содержимым тек- стового поля компонента. Одним из возможных ответов на событие нажатия кнопки может быть отключение компонента вызовом его метода setEnabled() с аргумен- том false, либо повторное его включение при помощи этого же метода setEnabled() с аргументом true. 1. Отредактируйте копию файла Window.java, заменив имя класса Window в объявлении, конструкторе и операторе экземпляра на Actions 2. В самое начало программы добавьте оператор для импортирова- ния функциональности всех классов пакета java.awt.event. import java.awt.event.* ; 3. Отредактируйте объявление класса для добавления интерфейса ActionListener в программу. class Actions extends JFrame implements ActionListener 4. Перед конструктором Actions() создайте две кнопки JButton, а также текстовое поле JTextArea. JButton btn1 = new JButton( "Кнопка 1" ) ; JButton btn2 = new JButton( "Кнопка 2" ) ; JTextArea txtArea = new JTextArea( 5 , 38 ) ; 5. Добавьте кнопки и текстовую область на контейнер JPanel. pnl.add( btn1 ) ; pnl.add( btn2 ) ; pnl.add( txtArea ) ; 6. Вставьте операторы для установки начального состояния двух ком- понентов. btn2.setEnabled( false ) ; txtArea.setText( "Кнопка 2 деактивирована" ) ; JAVA Actions.java 157 7. В конструкторе Actions() вставьте операторы, которые генериру- ют событие ActionEvent при нажатии кнопок. btn1.addActionListener( this ) ; btn2.addActionListener( this ) ; 8. После метода конструктора добавьте метод-обработчик события для интерфейса ActionListener, который будет отображать текст, идентифицирующий нажатую кнопку. public void actionPerformed( ActionEvent event ) { txtArea.setText( event.getActionCommand() + " Нажата и деактивирована" ) ; } 9. Вставьте операторы if , которые позволяют выполнить определен- ное ответное действие на нажатие каждой кнопки, в метод обра- ботчика событий. if ( event.getSource() == btn1 ) { btn2.setEnabled( true ) ; btn1.setEnabled( false ) ; } if ( event.getSource() == btn2 ) { btn1.setEnabled( true ) ; btn2.setEnabled( false ) ; } 10. Сохраните программу под именем Actions.java, затем скомпили- руйте и запустите, пробуя нажимать кнопки. На заметку Компоненты объявлены перед конструктором, поэто- му они доступны методу- обработчику событий. Совет Иногда полезно деактиви- ровать компонент до того, как пользователь выполнит требуемое действие. 9. Р аспознавание с обытий 158 Обработка событий элементов Изменения состояния компонентов JRadioButton, JCheckBox и JCom- boBox библиотеки Swing могут распознаваться интерфейсом ItemLis- tener , который, в свою очередь, передает событие ItemEvent методу- об- работчику itemStateChanged(). У объекта ItemEvent существует метод getItemSelectable() , который идентифицирует компонент, вызвавший событие, а также метод getStateChange(), возвращающий состояние компонента. Данный метод позволяет определить, что явилось причи- ной изменения статуса — выбор или отмена выбора элемента. Возвра- щенный статус может быть сравнен с константой ItemEvent.SELECTED. 1. Отредактируйте копию файла Window.java, заменив имя класса |