Презентация по Программированию. Книга Программирование на Java для начинающих
Скачать 4.47 Mb.
|
Window в объявлении, конструкторе и операторе экземпляра на States . Затем добавьте в самое начало программы оператор для импортирования функциональности пакета java.awt.event. import java.awt.event.* ; 2. Отредактируйте объявление класса, чтобы добавить интерфейс ItemListener в программу. class States extends JFrame implements ItemListener 3. Перед конструктором States() создайте следующие компоненты. String[] styles = { "В глубокой форме" , "Для гурманов" , "Тонкая" } ; JComboBox 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" > |