Главная страница

Презентация по Программированию. Книга Программирование на Java для начинающих


Скачать 4.47 Mb.
НазваниеКнига Программирование на Java для начинающих
АнкорПрезентация по Программированию
Дата03.02.2022
Размер4.47 Mb.
Формат файлаpdf
Имя файла638767.pdf
ТипКнига
#350143
страница16 из 18
1   ...   10   11   12   13   14   15   16   17   18
Window
в объявлении, конструкторе и операторе экземпляра на
States
. Затем добавьте в самое начало программы оператор для импортирования функциональности пакета java.awt.event.
import java.awt.event.* ;
2. Отредактируйте объявление класса, чтобы добавить интерфейс
ItemListener
в программу.
class States extends JFrame implements ItemListener
3. Перед конструктором
States()
создайте следующие компоненты.
String[] styles =
{ "В глубокой форме" , "Для гурманов" , "Тонкая" } ;
JComboBox box = new JComboBox ( styles ) ;
JRadioButton rad1 = new JRadioButton( "Белое" ) ;
JRadioButton rad2 = new JRadioButton( "Красное" ) ;
ButtonGroup wines = new ButtonGroup() ;
JCheckBox chk = new JCheckBox( "Пеперони" ) ;
JTextArea txtArea = new JTextArea( 5 , 38 ) ;
4. В конструкторе
States()
вставьте операторы для группировки двух компонентов JRadioButton.
wines.add( rad1 ) ;
wines.add( rad2 ) ;
5. Вставьте операторы для добавления компонентов на контейнер
JPanel
pnl.add( rad1 ) ;
pnl.add( rad2 ) ;
pnl.add( chk ) ;
JAVA
States.java
Совет
Обратите внимание, как до- бавляется текст в текстовую область при помощи метода
append().

159
pnl.add( box ) ;
pnl.add( txtArea ) ;
6. Добавьте операторы, чтобы выбираемые компоненты генерирова- ли событие ItemEvent при выборе или отмене выбора элемента.
rad1.addItemListener( this ) ;
rad2.addItemListener( this ) ;
chk.addItemListener( this ) ;
box.addItemListener( this ) ;
7. После метода конструктора добавьте метод-обработчик события для интерфейса ItemListener, который идентифицирует элементы, выбранные компонентами JRadioButton.
public void itemStateChanged( ItemEvent event )
{
if ( event.getItemSelectable() == rad1 )
txtArea.setText( "Выбрано белое вино" ) ;
if ( event.getItemSelectable() == rad2 )
txtArea.setText( "Выбрано красное вино" ) ;
}
8. Добавьте оператор
if
в обработчик события для определения ста- туса компонента JCheckBox.
if ( ( event.getItemSelectable() == chk ) &&
( event.getStateChange() == ItemEvent.SELECTED ) )
txtArea.append( "\nВыбрана Пеперони\n" ) ;
9. Добавьте оператор
if
в обработчик события для определения ста- туса компонента JComboBox.
if ( ( event.getItemSelectable() == box ) &&
( event.getStateChange() == ItemEvent.SELECTED ) )
txtArea.append("Выбрана" + event.getItem().toString()) ;
10. Сохраните программу под именем States.java, затем скомпилируйте и запустите, пробуя выбрать различные элементы слева направо.
Внимание
Компонент JComboBox порож- дает два события ItemEvents при выборе элемента: пер- вое — это выбор элемента, а второе — отмена выбора предыдущего выбранного элемента. Вот почему в ша- гах 8 и 9 нужно идентифици- ровать оба порождающих компонента, а также тип события ItemEvent.
Совет
Обратите внимание, как метод getItem() возвращает измененный элемент.

9. Р
аспознавание с
обытий
160
Реагирование на события
клавиатуры
Компоненты библиотеки Swing, которые позволяют пользователю вво- дить текст, могут распознавать нажатие клавиш при помощи интер- фейса KeyListener, который передает событие KeyEvent следующим трем методам-обработчикам:
Обработчик события
Описание
keyPressed( KeyEvent )
Вызывается при нажатии клавиши на клавиатуре
keyTyped( KeyEvent )
Вызывается после нажатия клавиши на клавиатуре
keyReleased( KeyEvent )
Вызывается при освобождении кла- виши на клавиатуре
Если в программе реализуется интерфейс KeyListener, эти три мето- да должны быть обязательно объявлены (даже если используются не все три).
У объекта KeyEvent существует метод getKeyChar(), который воз- вращает символ, соответствующий нажатой клавише, а также метод
getKeyCode()
, возвращающий целочисленное значение, представляю- щее данную клавишу в формате ЮНИКОД. Дополнительный метод
getKeyText()
принимает в качестве аргумента код клавиши и возвра- щает описание этой клавиши.
1. Отредактируйте копию программы Window.java, заменив имя клас- са Window в объявлении, конструкторе и экземпляре на Keystrokes.
Затем добавьте в начало импортирование функциональности паке- та java.awt.event.
import java.awt.event.* ;
2. Отредактируйте объявление класса, чтобы добавить в программу интерфейс KeyListener.
class Keystrokes extends JFrame implements KeyListener
3. Перед конструктором
Keystrokes()
создайте компонент JTextField и компонент JTextArea.
JTextField field = new JTextField( 38 ) ;
JTextArea txtArea = new JTextArea( 5 , 38 ) ;
JAVA
Keystrokes.java

161
4. Вставьте операторы для добавления этих двух компонентов на кон- тейнер JPanel.
pnl.add( field ) ; pnl.add( txtArea ) ;
5. В конструкторе
Keystrokes()
добавьте оператор, который застав- ляет компонент JTextField генерировать события KeyEvent.
field.addKeyListener( this ) ;
6. После метода конструктора добавьте обработчик событий, кото- рый распознает нажатие клавиш.
public void keyPressed( KeyEvent event )
{
txtArea.setText( "Нажата клавиша" ) ;
}
7. Добавьте еще один обработчик события, который отображает сим- вол клавиши после того, как она нажата.
public void keyTyped( KeyEvent event )
{
txtArea.append( "\nСимвол : "
+ event.getKeyChar() ) ;
}
8. Добавьте третий обработчик события, который будет отображать код клавиши и текст, когда клавиша отпущена.
public void keyReleased( KeyEvent event )
{
int keyCode = event.getKeyCode() ;
txtArea.append( "\nКод клавиши : "
+ event.getKeyCode() ) ;
txtArea.append( "\nТекст клавиши : "
+ event.getKeyText( keyCode ) ) ;
}
9. Сохраните программу под именем Keystrokes.java, затем скомпи- лируйте и запустите, пробуя набрать что-нибудь в текстовом поле сверху.
Внимание
Метод getKeyCode() воз- вращает код клавиши в случае, если вызван обработчик keyPressed() или keyReleased(), но не
keyTyped().
Совет
Запустите программу и нажмите несимвольную клавишу, например Пробел, чтобы увидеть ее текстовое название.

9. Р
аспознавание с
обытий
162
Ответ на события мыши
Компоненты библиотеки Swing могут распознавать действия пользова- теля с мышью при помощи интерфейса MouseListener, который пере- дает событие MouseEvent следующим пяти методам-обработчикам.
Обработчик события
Описание
mousePressed( MouseEvent )
Нажата кнопка мыши
mouseReleased( MouseEvent )
Освобождена кнопка мыши
mouseClicked( MouseEvent )
Выполнен щелчок кнопкой мыши
mouseEntered( MouseEvent )
Указатель входит в область
mouseExited( MouseEvent )
Указатель выходит из области
Движение мыши можно распознавать при помощи интерфейса Mouse-
MotionListener
, который передает событие MouseEvent двум обработ- чикам:
Обработчик события
Описание
mouseMoved( MouseEvent )
Перемещение указателя
mouseDragged( MouseEvent )
Перетаскивание (с нажатой кнопкой)
Если в программе реализованы интерфейсы MouseListener или Mouse-
MotionListener
, то нужно объявлять все методы-обработчики (даже если они не используются).
У объекта MouseEvent, который передается интерфейсу MouseMotion-
Listener
, существуют методы getX() и getY(), которые возвращают текущие координаты указателя мыши относительно графического ком- понента, сгенерировавшего событие.
1. Отредактируйте копию файла Window.java, заменив имя класса
Window
в объявлении, конструкторе и операторе экземпляра на
Mouse
. Затем добавьте начальный оператор для импортирования функциональности пакета java.awt.event.
import java.awt.event.* ;
2. Отредактируйте объявление класса, чтобы добавить интерфейсы
MouseListener
и MouseMotionListener в программу.
class Mouse extends JFrame
implements MouseListener , MouseMotionListener
JAVA
Mouse.java

163
3. Перед конструктором Mouse() создайте компонент JTextArea, а также две целочисленные переменные для хранения координат указателя.
JTextArea txtArea = new JTextArea( 8 , 38 ) ;
int x , y ;
4. В конструкторе
Mouse()
вставьте операторы для добавления ком- понентов JTextArea на контейнер JPanel, а также для генерации событий MouseEvent.
pnl.add( txtArea ) ;
txtArea.addMouseMotionListener( this ) ;
txtArea.addMouseListener( this ) ;
5. После метода конструктора добавьте два обработчика событий для интерфейса MouseMotionListener.
public void mouseMoved( MouseEvent event )
{ x = event.getX() ; y = event.getY() ; }
public void mouseDragged( MouseEvent event ) { }
6. Добавьте пять обработчиков событий для интерфейса MouseLis-
tener
public void mouseEntered( MouseEvent event )
{ txtArea.setText( "\nНажата кнопка мыши" ) ; }
public void mousePressed( MouseEvent event )
{ txtArea.append( "\nКнопка нажата, когда указатель в позиции X: " +x+ "Y: " +y ) ; }
public void mouseReleased( MouseEvent event )
{ txtArea.append( "\nКнопка мыши отпущена" ) ; }
public void mouseClicked(MouseEvent event ) { }
public void mouseExited(MouseEvent event ) { }
7. Сохраните программу под именем Mouse.java, затем скомпилируйте и запустите, щелкнув указателем мыши по компоненту JTextArea.
Совет
При помощи за- мены изображений в методах-обработчиках
mouseEntered() и mouseExited() можно до- стичь эффекта перекатыва- ния (ролловера).

9. Р
аспознавание с
обытий
164
Вывод сообщений
В библиотеке Swing для создания стандартного диалогового окна суще- ствует класс JOptionPane. Метод showMessageDialog() данного класса отображает сообщение пользователю; в сообщении размещается раз- личная информация, предупреждение или описание ошибок. Отобра- жаемое сообщение центрируется относительно родительского окна.
Метод showMessageDialog() может принимать четыре аргумента:
• родительский объект — обычно на него ссылается ключевое слово
this
;
• строковое сообщение для отображения;
• строковый заголовок диалога;
• одна из констант: INFORMATION_MESSAGE, WARNING_MESSAGE или
ERROR_MESSAGE
В зависимости от того, какая указана константа, в диалоговом окне бу- дет отображаться соответствующая иконка.
1. Отредактируйте копию файла Window.java, заменив имя класса
Window
в объявлении, конструкторе и операторе экземпляра на
Messages
2. Добавьте начальный оператор для импортирования функциональ- ности пакета java.awt.event.
import java.awt.event.* ;
3. Отредактируйте объявление класса, чтобы добавить интерфейс
ActionListener
в программу.
class Messages extends JFrame implements ActionListener
4. Перед конструктором Messages() создайте три компонента
JButton
JButton
btn1= new JButton( "Показать информационное сообщение" ) ;
JButton btn2= new JButton( "Показать предупреждение" ) ;
JButton btn3= new JButton( "Показать сообщение об ошибке" ) ;
5. Вставьте операторы для добавления компонентов кнопок на кон- тейнер JPanel.
pnl.add( btn1 ) ;
pnl.add( btn2 ) ;
pnl.add( btn3 ) ;
JAVA
Messages.java

165
6. В конструкторе
Messages()
вставьте операторы, генерирующие со- бытия ActionEvent для каждой кнопки.
btn1.addActionListener( this ) ;
btn2.addActionListener( this ) ;
btn3.addActionListener( this ) ;
7. После метода конструктора добавьте метод-обработчик событий для интерфейса ActionListener.
public void actionPerformed( ActionEvent event ) { }
8. Внутри фигурных скобок метода-обработчика вставьте условные операторы, отображающие диалог при нажатии клавиш.
if ( event.getSource() == btn1 )
JOptionPane.showMessageDialog( this , "Информация..." ,
"Диалоговое сообщение", JOptionPane.INFORMATION_MESSAGE ) ;
if ( event.getSource() == btn2 )
JOptionPane.showMessageDialog( this , "Предупреждение..." ,
"Диалоговое сообщение" , JOptionPane.WARNING_MESSAGE ) ;
if ( event.getSource() == btn3 )
JOptionPane.showMessageDialog( this , "Ошибка..." ,
"Диалоговое сообщение" , JOptionPane.ERROR_MESSAGE ) ;
9. Сохраните программу под именем Messages.java, затем скомпили- руйте и запустите, щелкнув указателем по каждой из кнопок.
Совет
Вы можете указать только два аргумента — родитель- ское окно и сообщение, тем самым создав диалог, в котором будут использо- ваться значок и заголовок по умолчанию.

9. Р
аспознавание с
обытий
166
Запрос пользовательского
ввода
В библиотеке Swing существует класс JOptionPane, позволяющий за- прашивать информацию у пользователя при помощи двух методов, открывающих диалоговое окно — метод showConfirmationDialog(), запрашивающий подтверждение, а также метод showInputDialog(), который предлагает ввести пользователю строку.
Оба эти метода могут принимать четыре аргумента:
• родительский объект — ссылка на него определяется ключевым словом this;
• строка запроса для отображения;
• строка, определяющая заголовок диалогового окна;
• одна из констант JOptionPane, таких как PLAIN_MESSAGE и опреде- ляющая кнопки для подтверждения, YES_NO_CANCEL_OPTION.
Диалоговое окно будет возвращать строку ввода в случае с диалогом ввода или целое число в результате нажатия на кнопки подтвержде- ния — 0 для подтверждения, 1 для отказа или 2 для отмены.
1. Отредактируйте копию файла Window.java, заменив имя класса
Window
в объявлении, конструкторе и операторе экземпляра на
Request
. После этого добавьте начальный оператор для импорти- рования функциональности пакета java.awt.event.
import java.awt.event.* ;
2. Отредактируйте объявление класса, чтобы добавить в программу интерфейс ActionListener.
class Request extends JFrame implements ActionListener
3. Перед конструктором
Request()
создайте компоненты JTextField и два компонента JButton.
JTextField field = new JTextField( 38 ) ;
JButton btn1 = new JButton( "Запрос подтверждения" ) ;
JButton btn2 = new JButton( "Запрос ввода" ) ;
4. Добавьте все компоненты на контейнер JPanel.
pnl.add( field ) ; pnl.add( btn1 ) ; pnl.add( btn2 ) ;
5. В конструкторе
Request()
вставьте операторы, которые будут гене- рировать событие ActionEvent для каждой кнопки.
btn1.addActionListener( this ) ;
btn2.addActionListener( this ) ;
JAVA
Request.java

167
6. После метода конструктора добавьте метод обработчика событий для интерфейса ActionListener.
public void actionPerformed( ActionEvent event ) { }
7. Внутри фигурных скобок обработчика событий вставьте условный оператор, для того чтобы организовать ответ на нажатие кнопок.
if ( event.getSource() == btn1 )
{
int n = JOptionPane.showConfirmDialog( this ,
"Вы согласны?" , "Диалог подтверждения" ,
JOptionPane.YES_NO_CANCEL_OPTION ) ;
switch( n )
{
case 0 : field.setText( "Согласен" ) ; break ;
case 1 : field.setText( "Не согласен" ) ; break ;
case 2 : field.setText( "Отменено" ) ; break ;
}
}
8. Вставьте условный оператор для обработки пользовательского ввода.
if ( event.getSource() == btn2 )
field.setText( JOptionPane.showInputDialog( this ,
"Введите ваш комментарий" , "Диалог ввода" ,
JOptionPane.PLAIN_MESSAGE ) ) ;
Сохраните программу под именем Request.java, затем скомпили- руйте и запустите, выбрав указателем каждую из кнопок.
Совет
Константа OK_CANCEL пред- лагает две кнопки для под- тверждения: OK возвраща- ет 0, а CANCEL возвращает 2.
Обратитесь к документации, чтобы узнать информацию о полном наборе констант.

9. Р
аспознавание с
обытий
168
Воспроизведение звука
Пакет java.applet содержит класс с именем AudioClip, в который встроены методы для проигрывания аудиофайлов форматов .au, .aiff,
.wav, а также .mid. Совместимость с компонентами библиотеки Swing поддерживается при помощи класса JApplet, который предлагает ме- тод newAudioClip(), возвращающий URL-адрес аудиофайла.
Аудиофайл должен быть загружен в качестве ресурса в объект
AudioClip
при помощи метода getResource() объекта ClassLoader — точно так же, как и файл изображения.
В ответ на пользовательские действия воспроизведение аудиофайла может быть начато и прекращено при помощи методов play() и stop() объекта AudioClip. Кроме того, аудиофайл может быть воспроизведен непрерывно при помощи метода loop().
1. Отредактируйте копию файла Window.java, заменив имя класса
Window
в объявлении, конструкторе и операторе экземпляра на
Sound
2. Добавьте начальный оператор для импортирования функциональ- ности всех классов пакета java.awt.event.
import java.awt.event.* ;
3. Отредактируйте объявление класса для добавления интерфейса
ActionListener
в программу.
class Sound extends JFrame implements ActionListener
4. Перед конструктором
Sound()
создайте объект ClassLoader.
ClassLoader ldr = this.getClass().getClassLoader() ;
5. Создайте объект
AudioClip
и загрузите файл звукового ресурса при помощи объекта ClassLoader.
java.applet.AudioClip audio =
JApplet.newAudioClip( ldr.getResource( "music.wav" ) ) ;
6. Создайте два компонента JButton для управления воспроизведе- нием звука.
JButton playBtn = new JButton( "Играть" ) ;
JButton stopBtn = new JButton( "Стоп" ) ;
На заметку
Подробнее о загрузке фай- лов изображений при помо- щи ClassLoader см. в главе 8.
JAVA
Sound.java
music.wav

169
7. Добавьте кнопки на контейнер JPanel.
pnl.add( playBtn ) ;
pnl.add( stopBtn ) ;
8. В конструкторе
Sound()
вставьте операторы, чтобы генерировать событие ActionEvent для каждой кнопки при их нажатии.
playBtn.addActionListener( this ) ;
stopBtn.addActionListener( this ) ;
9. После метода конструктора добавьте обработчик события для ин- терфейса ActionListener.
public void actionPerformed( ActionEvent event ) { }
10. Внутри фигурных скобок обработчика событий вставьте оператор для проигрывания аудиофайла по нажатию кнопки воспроизве- дения.
if ( event.getSource() == playBtn ) audio.play() ;
11. Вставьте оператор для остановки воспроизведения аудиофайла по нажатию кнопки остановки.
if ( event.getSource() == stopBtn ) audio.stop() ;
12. Сохраните программу под именем Sound.java, затем скомпилируй- те и запустите, используя кнопки для контроля над воспроизведе- нием аудиофайла.
Совет
Можно воспроизводить не- сколько звуковых объектов одновременно.
На заметку
Каждый раз, когда вызыва- ется метод play(), воспро- изведение стартует с начала файла.

9. Р
аспознавание с
обытий
170
Заключение

Для добавления одного или нескольких интерфейсов EventListener в объявление класса используется ключевое слово implements.
• Чтобы заставить компонент сгенерировать событие ActionEvent при его активации, используется метод компонента addActionLis-
tener()
, который принимает в качестве аргумента ключевое слово
this
• Интерфейс
ActionListener
передает сгенерированное событие
ActionEvent
в качестве аргумента методу-обработчику события
actionPerformed()
, который может реагировать на нажатие кноп- ки пользователем.
• Для того чтобы идентифицировать компонент, который сгенери- ровал событие, используется метод getSource().
• Интерфейс ItemListener создает сгенерированное собы- тие ItemEvent в качестве аргумента методу-обработчику
itemStateChanged()
, который может реагировать на выбор элемен- та пользователем.
• Для идентификации компонента, сгенерировавшего событие, ис- пользуется метод getItemSelectable().
• Интерфейс KeyListener передает сгенерированное событие
KeyEvent
в качестве аргумента трем обязательным методам- обра- ботчикам событий, которые могут реагировать на нажатие кнопки пользователем и возвращать символ, соответствующий нажатой кнопке.
• Интерфейс
MouseListener
передает сгенерированное событие
MouseEvent
в качестве аргумента пяти обязательным методам- обработчикам, которые могут реагировать на действия пользова- теля с мышью.
• Интерфейс
MouseMotionListener
передает сгенерированное собы- тие MouseEvent в качестве аргумента двум обязательным обработ- чикам событий, которые могут реагировать на движения указателя мыши.
• Метод
showMessageDialog()
класса JOptionPane создает диалого- вое окно, отображающее пользователю сообщение, а для запроса пользовательского ввода используются методы showInputDialog() и showConfirmationDialog().
• Звуковые ресурсы могут представляться при помощи класса
AudioClip
пакета java.applet и проигрываются при помощи мето- да этого класса play().

10
10
Развертывание
Развертывание
программ
программ
В данной главе
В данной главе
демонстрируется,
демонстрируется,
как развертывать
как развертывать
Java-программы при
Java-программы при
помощи настольных
помощи настольных
приложений и встроенных
приложений и встроенных
в веб-страницы апплетов.
в веб-страницы апплетов.
• Методы
развертывания
• Методы
развертывания
• Распространение
программ
• Распространение
программ
• Построение
архивов
• Построение
архивов
• Развертывание
приложений
• Развертывание
приложений
• Подписывание
jar-файлов
• Подписывание
jar-файлов
• Использование технологии Web Start
• Использование технологии Web Start
• Изготовление
апплетов
• Изготовление
апплетов
• Преобразование
веб-страниц
• Преобразование
веб-страниц
• Развертывание
апплетов
• Развертывание
апплетов
• Заключение
• Заключение

10. Р
а
звер
тывание программ
172
Методы развертывания
Технология Java предлагает два различных способа для развертывания программ :
• настольные приложения , которые могут быть запущены на любой из платформ, где установлено соответствующее окружение Java
Runtime Environment;
• апплеты для веб-страниц, которые выполняются на любом веб- браузере, где установлен соответствующий Java-плагин .
Принцип выбора метода развертывания обычно определяется назна- чением программ. Например, апплеты используются в легких програм- мах, которые должны быть интегрированы в содержимое веб-страниц, в то время как настольные приложения предпочтительнее использо- вать для более серьезных программ.
Как апплеты, так и настольные приложения могут быть созданы из- начально из общей программы, наподобие представленной ниже про- граммы Lotto.java.
Конструктор Lotto() генерирует простой интерфейс Swing, пред- ставляющий собой панель, содержащую одну метку, одно тексто- вое поле и одну кнопку. Данная панель помещена на окно размерами
260 × 200 пикселов. Компонент «метка» просто отображает описатель- ное графическое изображение:
Lotto.png — области с шахматным рисунком являются прозрачными.
Метод-обработчик для кнопки запускает алгоритм выбора последова- тельности из шести случайных чисел в диапазоне от 1 до 49, которые будут отображаться в компоненте «текстовое поле».
Программа Lotto.java, представленная здесь, используется на протяже- нии всей главы для создания, как приложения, так и апплета.
import javax.swing.* ;
import java.awt.event.* ;
public class Lotto extends JFrame implements ActionListener
{
//
Компоненты.
ClassLoader ldr = this.getClass().getClassLoader() ;
java.net.URL iconURL = ldr.getResource( "Lotto.png" ) ;
Внимание
Программы в данной книге скомпилированы при помо- щи Java 8 — для корректно- го выполнения приложения требуется установка соответ- ствующего Java 8 JRE, а для выполнения апплетов — плагин Java 8.

173
ImageIcon icon = new ImageIcon( iconURL ) ;
JLabel img = new JLabel( icon ) ;
JTextField txt = new JTextField( "" , 18 ) ;
JButton btn = new JButton( "Показать счастливые номера" ) ;
JPanel pnl = new JPanel() ;
//
Конструктор.
public
Lotto()
{
super( "Приложение Lotto" ) ; setSize( 260 , 200 ) ;
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ) ;
pnl.add( img ) ; pnl.add( txt ) ; pnl.add( btn ) ;
btn.addActionListener( this ) ;
add( pnl ) ; setVisible( true ) ;
}
// Обработчик событий.
public void actionPerformed( ActionEvent event )
{
if ( event.getSource() == btn )
{
int[] nums = new int[50] ; String str = "" ;
for ( int i = 1 ; i < 50 ; i++ ) { nums[i] = i ; }
for ( int i = 1 ; i < 50 ; i++ )
{ int r = (int) ( 49 * Math.random() ) + 1 ;
int
temp= nums[i] ; nums[i]= nums[r] ; nums[r]= temp ; }
for ( int i = 1 ; i < 7 ; i++ )
{ str += " " + Integer.toString( nums[i] ) + " " ; }
txt.setText(
str
)
;
}
}
// Точка входа.
public static void main ( String[] args )
{ Lotto lotto = new Lotto() ; }
}
JAVA
Lotto.java
Совет
Данный обработчик событий перемешивает целые числа в массиве, а затем первые шесть чисел заносит в стро- ковый массив.

10. Р
а
звер
тывание программ
174
Распространение
программ
Объект ClassLoader в программе Lotto.java с предыдущей страницы ожидает, что графический файл Lotto.png размещен в том же каталоге, что и файл программы, поэтому, прежде чем попытаться скомпилиро- вать программу, нужно убедиться, что файлы размещены именно та- ким образом.
Убедившись, что файлы расположены так, как это требуется, можно запускать компилятор javac для создания файла Lotto.class, а затем ин- терпретатор java для запуска программы.
Программа Lotto открывает новое окно определенного размера, содер- жащее компоненты интерфейса Swing. Каждый раз, когда пользователь нажимает на кнопку, обработчик события отображает шесть новых случайных чисел в диапазоне от 1 до 49 в текстовом поле.
Внимание
Файл изображения должен быть именован в точности так:
Lotto.png (а не lotto.png).

175
Программа Lotto, как и другие примеры данной книги, скомпилиро- вана для Java 8. Ее можно распространять для исполнения на других компьютерах, где установлено Java 8 Runtime Environment независимо от операционной системы.
Например, на скриншотах ниже файлы Lotto.class и Lotto.png скопиро- ваны на рабочий стол компьютера, на котором установлена операци- онная система Linux и Java 8 Runtime Environment. Поэтому программа
Lotto
может быть запущена при помощи интерпретатора java точно так же, как и на исходной операционной системе Windows:
При распространении таким образом Java-программ существует, од- нако, опасность, что программа не выполнится, если файлы ресурсов станут недоступны — в данном случае отсутствие файла Lotto.png при- ведет к следующей ошибке:
Совет
Для распространения про- граммы не требуется вклю- чать файл исходных кодов
.java. Необходимы только файлы
.class, а также ресурс- ные файлы.
На заметку
В больших программах может использоваться большое количество файлов ресурсов, корректное рас- положение которых может быть случайно нарушено пользователем. Решение, описанное ниже, заключа- ется в упаковке программы и всех ее ресурсов в один ис- полняемый архивный файл.

10. Р
а
звер
тывание программ
176
Построение архивов
Пакет JDK содержит утилиту jar, которая позволяет упаковывать фай- лы программ, а также все ресурсные файлы в один файловый Java-архив
(JAR
). Данная утилита сжимает все файлы, используя популярный формат ZIP, и создает файл с расширением .jar. JAR-архивы являются эффективным методом и помогают избавиться от случайного удаления ресурсных файлов. Интерпретатор java полностью поддерживает JAR- архивы, так что приложения и апплеты могут быть запущены без необ- ходимости извлекать отдельные файлы из архива . Инструмент jar, так же, как и интерпретатор java и компилятор javac, размещен в каталоге
bin, и его можно запускать из командной строки для выполнения сле- дующих основных операций с архивами.
Синтаксис команды
Операция
jar cf jar-файл входные файлы
Создание JAR-архива
jar cfe jar-файл точка_входа
входные файлы
Создание JAR-архива с ука- занием точки входа в прило- жение
jar tf jar-файл
Просмотр содержимого
JAR-архива
jar uf jar-файл
Обновление содержимого
JAR-архива
jar ufm jar-файл файл_атрибутов
Обновление содержимого манифеста JAR-архива с добав- лением в него атрибутов
jar xf jar-файл
Извлечение содержимого
JAR-архива
jar xf jar-файл архивный_файл
Извлечение определенно- го файла из содержимого
JAR-архива
Выполните следующие шаги, чтобы создать JAR-архив для программы
Lotto
, описанной в начале главы.
1. Откройте командную строку (терминальное окно) и перейдите в каталог, в котором размещены файлы программы Lotto — Lotto.
class и Lotto.png.
2. В командной строке наберите jar cfe Lotto.jar Lotto Lotto.
class Lotto.png
, затем нажмите клавишу Enter для создания архи- ва Lotto.jar.
Совет
В случае с большими про- граммами для архивации множественных файлов можно использовать сим- вол шаблона *. Например, команда jar cf Program.
jar *.class архивирует все файлы классов в текущем каталоге.
JAR
Lotto.jar

177
3. Теперь наберите
jar tf Lotto.jar
для просмотра содержимого
JAR-архива.
Обратите внимание, что инструмент jar автоматически создает ката- лог META-INF рядом с архивными файлами. Он содержит текстовый файл манифеста с именем MANIFEST.MF. В данный файл манифеста добавляется атрибут permissions, который определяет доступ к ресур- сам приложения.
4. Запустите простой текстовый редактор и наберите в нем следу- ющее:
Application-Name:
Lotto
Permissions:
all-permissions
Затем сохраните файл под именем permissions.txt рядом с JAR- ар- хивом.
5. Наберите команду
jar ufm Lotto.jar permissions.txt
, затем на- жмите клавишу Enter для добавления атрибута permissions в ма- нифест.
Внимание
Файл
permissions.txt должен оканчиваться символом новой строки — нажмите клавишу Enter после послед- ней строки перед сохране- нием файла.
permissions.txt
Совет
Извлеките копию каталога
META-INF, используя команду
jar xf Lotto.jar META-
INF, чтобы изучить файл
MANIFEST.MF — он должен выглядеть точно так же, как показано на последнем рисунке.

10. Р
а
звер
тывание программ
178
Развертывание
приложений
Файлы JAR-архивов являются исполняемыми на любой системе, на ко- торой установлена соответствующая версия Java Runtime.
1. В командной строке перейдите в каталог, в котором расположен файл Lotto.jar, затем наберите команду java -jar Lotto.jar и на- жмите клавишу Enter для запуска приложения Lotto.
2. Альтернативным методом запуска является двойной щелчок мы- шью по файлу Lotto.jar, либо щелчок правой кнопкой мыши и вы- бор команды Открыть с помощью (Open with) и Java Runtime.
Внимание
При запуске JAR-файлов расширение
.jar необходимо указывать.
Совет
Установите для файлов JAR запускаемым по умолчанию приложением JRE.

179
Подписывание jar-файлов
В случае если Java-программа предназначена для широкого распростра- нения, JAR-архивы подписывают цифровой подписью , для того чтобы пользователи, запускающие их, могли удостовериться, что программа выпущена доверенным источником. Попытка запустить неподписан- ное Java-приложение, распространяемое через Интернет при помощи технологии Java Web Start или через Java-апплет, встроенный в веб- страницу, будет выводить сообщение об ошибке:
Сертификаты, предназначенные для подписи кода, выпускаются до- веренными центрами сертификации (Certificate Authority или CA), та- кими как VeriSign, DigiCert или GlobalSign. Сертификаты выпускаются после проверки центрами авторства разработчиков. Таким образом, пользователи могут быть уверены, что программа, подписанная сер- тификатом, получена из надежного источника. Центры сертификации обеспечивают разработчикам персональный файл, содержащий закры- тый ключ, с помощью которого разработчик подписывает JAR-файлы, а в пакете JDK для этих целей существует утилита jarsigner.
1. Отройте командную строку (терминальное окно) и перейдите в ка- талог, где размещен файл Lotto.jar.
2. Введите команду
jarsigner
, которая идентифицирует файл ключа, тип хранения, файл JAR-архива и имя разработчика; затем нажми- те клавишу Enter.
jarsigner -keystore certificate.pfx
-storetype
pkcs12
Lotto.jar
"Mike
McGrath"
3. Введите парольную фразу, которую вы отправите в центр серти- фикации для своего сертификата. Дальше вы увидите ответ, под- тверждающий подпись JAR-файла.
Внимание
В пакете JDK существует утилита keytool, при помо- щи которой можно соз- дать самоподписываемые сертификаты , но они больше не поддерживаются для
JAR-файлов.
certificate.pfx
Данный файл не включен в архив файлов примеров к этой книге, поскольку вам нужен будет собственный сертификат.
Совет
Проверить, подписан ли JAR- файл, вы можете с помощью команды jarsigner -verify
Lotto.jar.

10. Р
а
звер
тывание программ
180
Использование
технологии Web Start
Технология Java Web Start позволяет пользователям запускать Java- приложения простым нажатием на гиперссылку, находящуюся на веб-странице. Ссылка указывает на файл JNLP (протокол Java Network
Launching Protocol), который предоставляет информацию о приложе- нии в формате XML. Выполните следующие шаги, чтобы запустить приложение Lotto при помощи ссылки с веб-страницы.
1. Откройте простой текстовый редактор, например Блокнот (Note- pad), и скопируйте следующее содержимое в формате XML для соз- дания файла протокола JNLP.


spec = "1.0+"codebase = "file:///C:/MyJava/" href = "Lotto.jnlp" >


Java in easy steps
1   ...   10   11   12   13   14   15   16   17   18


написать администратору сайта