Розглянемо опції на закладці Project:, Статті, Java, статті


Наступна закладка Run / Debug призначена для установки аргументів командного
рядки, які будуть передані програмі або аплет під час запуску, і
деякі інші параметри:


Завантаження наявного проекту


Якщо вам потрібно відкрити наявний проект, можна двічі клацнути на піктограмі
проекту JBuilder у вікні Explorer (Провідник). Автоматично буде запущений
Borland JBuilder, і проект буде відкритий у вікні AppBrowser. У середовищі розробки
JBuilder проект відкривається командою File Open / Create. На екрані виникне
діалогова панель, в якій потрібно вибрати необхідний проект.

Додавання та видалення файлів проекту


Для додавання файлів в проект скористайтеся вже знайомої діалогової панеллю
Open / Create. Відкрийте її командою File Open / Create, виберіть файл, який
потрібно додати, відмітьте прапорець Add to Project і натисніть кнопку OK. Обраний
файл буде додано до поточний проект і відкритий у вікні AppBrowser.

Ще один спосіб додавання файлу в проект – натиснути у вікні AppBrowser кнопку з
зображенням папки, на якій намальований знак "плюс". На екрані з'явиться та сама
діалогова панель Open / Create, у якій потрібно виділити додається файл і
натиснути кнопку OK.

Щоб видалити файл з проекту виділіть потрібний файл і натисніть кнопку з
зображенням папки зі знаком "мінус" або ж виберіть з меню File пункт Remove
from Project.

Розширення проекту


Коли проект успішно створений, його потрібно розширити, додаючи в нього файли з
вихідними текстами на мові Java і інші файли, які передбачені вашим
проектом. Використовуйте команду File New, щоб викликати діалогову панель з
різними майстрами для створення нових елементів.

У діалоговій панелі New кілька сторінок з закладками і багато різних
майстрів. Коротко розглянемо, як користуватися кожним з них.

Майстри закладки New


Application. Створює готове Java-додаток з графічним
вікном-спадкоємцем класу java.awt.Frame, рядком статусу, меню та кнопками
швидкого доступу. На першому кроці цього майстра з'являється діалогове вікно, в
якому вводиться обов'язкова інформація:


Якщо відзначити прапорець Generate header comments, то в початок файлу з вихідним
текстом будуть додані коментарі з зазначенням авторства і деякої іншої
стандартною інформацією. На наступному кроці після натискання кнопки Next, майстер
відображає іншу сторінку, в якій ви вводите додаткову інформацію для
створення вікна програми:


Кілька позначуваних кнопок відповідають за генерацію вихідного тексту для
додаткових елементів вікна програми:


Коли введення інформації завершений, потрібно натиснути на кнопку Finish. В результаті
JBuilder згенерує два файли з вихідними текстами на мові Java, які
додаються в новий проект.

Applet. Цей майстер створює аплет. На першому кроці майстра потрібно ввести
основну інформацію про створюваний аплету:


Стиль аплета визначається трьома позначуваних кнопками:


На другому кроці передбачається завдання параметрів аплета, якими можна
управляти з HTML-сторінки. У результаті всередині тега APPLET будуть згенеровані
теги PARAM і текст для обробки цих параметрів аплетів.

Таблиця, в яку ви вводите дані, складається з кількох полів:


Зірочкою в таблиці параметрів позначаються поля, в яких обов'язково
повинна бути інформація. Поле типу – список,
перераховують наявні типи змінних.

JBuilder генерує спеціальний метод для витягання значень параметрів,
переданих аплет Web-сторінкою

public String getParameter(String key, String def) {
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}

і фрагмент вихідного тексту, який видобуває значення параметра або
встановлює значення параметра за замовчунням:

try { counter = Long.parseLong(
this.getParameter("COUNTER", "1000"));
} catch (Exception e)
{ e.printStackTrace(); }

На третьому кроці майстра створення аплета генерується Web-сторінка, з якої
буде запускатися отриманий аплет. Для створення такої сторінки потрібно зазначити
кнопку Generate HTML. Далі вам належить заповнити наступні поля:


Згенерований і відкомпільований аплет не виконує ніякої корисної
функції, але може бути запущений.

Project. З цим майстром ви вже познайомилися, коли ми розбирали
процес створення нового проекту викликом команди File New Project. І ця команда,
і запуск майстра роблять одне й те саме.

Frame. Для створення вікна програми можна використовувати майстер Frame,
який створює клас-спадкоємець від бібліотечного класу java.awt.Frame. Вам
потрібно заповнити поля всього однієї діалогової панелі:


Примірник одержуваного класу ніде не створюється, і навіть не встановлюється
заголовок вікна. Тому, якщо ви хочете використовувати його продуктивно, перше,
що потрібно зробити, – викликати з програми конструктор згенерованого майстром
Frame класу вікна:

BookFrame window = new BookFrame();

Найкраще вкласти цей рядок в метод main (), який запускається
віртуальною машиною Java таким, що самим першим:

public static void main(String[] args)
{
BookFrame window = new BookFrame();
window.setSize(400, 200);
window.setVisible(true);
}

Дві інші рядки не менш важливі. Перша змінює розмір вікна до бажаного –
без неї ви побачите тільки заголовок вікна. Другий рядок виводить вікно на екран,
роблячи його видимим. Для розміщення рядка створення заголовка найкраще підходить
перший рядок методу jbInit ():

private void jbInit() throws Exception
{
this.setTitle("Book Frame Window");
xYLayout1.setWidth(500);
xYLayout1.setHeight(300);
this.setLayout(xYLayout1);
}

Якщо ви виконаєте всі ці маніпуляції, то отримаєте очікуване – нормальне
графічне вікно програми.

Dialog. Майстер Dialog призначений для створення класу діалогової
панелі. Майстер запитає у вас стандартні дані:


Створена діалогова панель – це просто порожній клас Java. Як і у випадку з
вікном класу Frame, виклик діалогової панелі потрібно робити вручну.
Додайте в методі main () рядок створення екземпляра класу BookDlg:

BookDlg dialog = new BookDlg(new Frame(),
"Діалогова панель BookDlg", true);
dialog.show (); / / Показати діалогову панель на екрані

У конструкторі класу потрібно звернути особливу увагу на його перший параметр.
Їм має бути посилання на вікно-батько діалогової панелі. У реальному додатку
ми передали б коректну посилання, але в нашому прикладі для простоти передається
посилання на нове невидиме пусте вікно. Другий параметр – це текст заголовка
вікна панелі, а третій говорить про те, що створюване діалогове вікно модальне,
тобто виконання програми зупиняється до тих пір, поки діалогова панель
не буде закрита. Якщо встановити цей параметр в false, то отримане вікно
діалогової панелі буде немодальному, тобто незалежним від головного вікна
додатки, самостійним. Таким вікном, наприклад, є діалогова панель
пошуку з заміни текстового процесора Microsoft Word.

Panel. Процес створення панелі практично нічим не відрізняється від
створення діалогової панелі (див. вище Dialog). Зауважимо лише, що запускати панель
на виконання як самостійний клас не рекомендується. Використовувати панелі
потрібно як візуальний компонент для вікон і аплетів, а також як
базового класу для нових компонентів.

Data Module. Модулі даних, які виходять в результаті роботи
майстра Data Module, використовуються як контейнери для компонентів доступу
до баз даних. Ми розглянемо їх, розповідаючи про створення СУБД за допомогою Borland
JBuilder. Поки ж досить знати, що майстер Data Module запитує
стандартну інформацію для запису класу файлу:


Package – Пакет, в який буде додано новий клас;


Деякі параметри встановлюються позначуваних кнопками:


Усередині нового класу є спеціальне поле invokedStandalone. Воно не так
вже необхідно, тому що не несе ніякого функціонального навантаження. Але його можна
використовувати як прапора, яке зазначає, що даний клас запущений як
самостійний додаток. Це демонструє другий рядок методу main ().
Втім, це може знадобитися у тих рідкісних випадках, коли ваш клас повинен
працювати і як клас для інших програм, і як самостійний додаток.

HTML. Цей майстер робить просту HTML-сторінку, додаючи її до проекту. Він
вкрай примітивний, тому вам доведеться самостійно навіть перейменовувати
отримані файли сторінок HTML. Оригінальний текст сторінки, що отримується в результаті
роботи майстра HTML, мінімальний:

 <HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type"
CONTENT="text/html; charset=windows-1251">
<TITLE>
The Title
</TITLE>
</HEAD>
<BODY>
The text
</BODY>
</HTML>

Майстри закладки Panels


Tabbed pages. Цей вельми цікавий майстер створює сторінки з
закладками Tabbed pages. Отримується в результаті роботи цього майстра файл з
вихідним текстом на Java виконує створення панелі з трьома закладками по
замовчуванням і двома кнопками – OK і Cancel.

Дані перемикаються, але обробники натискання кнопок порожні, розраховані на
те, що ви самі додасте в них необхідний текст. Щоб побачити всю цю
конструкцію з панелей, закладок і кнопок, ви, як завжди, повинні створити
вікно-контейнер (Frame, Applet, Dialog і т. д.) і додати в нього відповідний
вихідний текст:

window.add( new TabbedPages() );

Зверніть увагу на те, що цей рядок має бути розташована десь до
появи вікна на екрані:

window.setVisible(true);

інакше ви виявите мерехтіння при додаванні всіх компонентів у вікно.

Dual list box. Цей майстер створює вихідний текст, який реалізує панель
з двома списками, кнопками OK і Cancel і чотирма кнопками для перенесення
елементів з одного списку в інший.

Подвійний список повинен бути доданий у вікно-контейнер, і з ним також потрібно
починати працювати з вікна візуального дизайнера.

Майстер закладки Menus


StandardMenu. Майстер створює клас StandardMenu, в якому
виробляються всі стандартні дії зі створення і ініціалізації пунктів меню.
В результаті ви отримуєте повноцінне меню, що складається з трьох пунктів: File,
Edit і Help. Вони містять стандартні підпункти, прийняті в основних
комерційних додатках. Щоб скористатися меню, отриманими в результаті
роботи майстра StandardMenu, спочатку вставте у вихідний текст вікна-контейнера,
успадкованого від класу java.awt. Frame, строчку, яка додасть меню у вікно:

window.setMenuBar(new StandardMenu());

Далі в панелі навігації оберіть файл StandardMenu.java і відкрийте
візуальний дизайнер. Додайте потрібні пункти меню і видаліть непотрібні, після чого
приступайте до створення обробників подій від меню.

Майстри закладки Dialogs


About Box. Майстер About Box надає можливість створити панель з
інформацією про ваш додатку. Після запуску цього майстра у вашому проекті
з'являється новий файл AboutBox.java з вихідним текстом класу діалогової панелі
About. Відредагуйте його зображення у візуальному дизайнері як вам подобається.
Щоб показати діалогову панель на екрані, скористайтеся такою рядком тексту:

AboutBox about = new AboutBox(window, "About", true);

Перший параметр конструктора, який посилається на головне вікно програми, не
може бути проігнорований, інакше буде порушена виняткова ситуація.

ПВизивать діалогову панель About найкраще з обробника пункту меню Help
About:

about.show();

Standard Dialog1 і Standard Dialog2. Майстер Standard Dialog1 створює звичайну
діалогову панель з єдиною панеллю і кнопками OK і Cancel,
розташовуються в нижній частині вікна. І навпаки, майстер Standard Dialog2
розміщує кнопки в правій частині вікна. Зайшовши у візуальний дизайнер, ви можете
відредагувати отриману діалогову панель і обробники натискання кнопок. Виклик
діалогової панелі вже знайомим вам методом show ().

Password Dialog. Як ви, напевно, вже здогадалися, майстер Password
Dialog створює початковий текст діалогової панелі для введення пароля. Це проста
діалогова панель з єдиною відмінністю: текст, який набирає користувач,
замінюється рядком спеціальних символів, щоб сторонні не могли побачити той
текст, який ви набираєте.

Майстер закладки Data Modules


Employee Data. Це єдиний майстер, який представляє собою готовий
модуль даних. Він призначений для створення бази даних службовців і налаштований на
базу даних прикладу, що поставляється разом з локальною копією сервера InterBase.
Використовуйте його як шаблон для створення своїх власних модулів даних. Вам
знадобиться перенастроювати його на своє завдання, змінивши імена баз даних і
деякі інші параметри. В іншому Employee Data – це готове
проміжну ланку для клієнт-серверного додатку.

Майстри закладки BeansExpress


Майстри цієї закладки складають набір BeansExpress, за допомогою якого
можливе швидке створення компонентів JavaBeans:


Майстер закладки Other


Example Snippet. Майстер Example Snippet – це діалогова панель з
прикладом найпростішого вихідного тексту створення і ініціалізації візуального
класу-спадкоємця від BevelPanel. Він примітний тим, що надає робочий
фрагмент тексту, загального практично для всіх візуальних класів. Отже,
створення нового такого класу спрощується до межі. Запустивши майстер, ви
змінюєте вихідний текст, як вам потрібно, і, натиснувши кнопку OK, створюєте новий
файл з новим класом. Всередині отриманого вихідного тексту вже є методи
ініціалізації і установки екранних розмірів, рядки імпорту необхідних
компонентів і обробник виняткової ситуації, що виникає в процесі
створення екземпляра класу.

Як ознайомитися з ієрархією класів


Середа JBuilder надає користувачеві інструмент перегляду ієрархії
вибраних класів. Якщо ви вкажете на файл з певним класом і натисните
праву кнопку миші, то виникне локальне меню, в якому потрібно вибрати команду
Class Hierarchy. Відкриється додаткова закладка Hierarchy у вікні AppBrowser.
У навігаційній панелі буде показана вся ієрархія обраного класу аж до
предка всіх Java-класів java.lang.Object.

Ви можете вивчити пристрій класів і їх предків, що в багатьох випадках
видається дуже корисним, а завершивши роботу з ієрархією, закрийте закладку
Hierarchy. Для цього клацніть на ній правою кнопкою миші і виберіть пункт меню
Drop Hierarhy tab.

Створення аплета


У цьому розділі ми попрактікуемся у створенні аплета за допомогою JBuilder. Наш
аплет буде сканувати всю файлову систему того диска, з якого він
запускається.

Скористаємося майстром створення аплета, розташованим в діалоговій панелі
New, спричиненої командою File New New Applet.

На екрані з'явиться діалогова панель, в якій задається основна,
формує скелет проекту інформація.

Для початку потрібно заповнити поле Package, в яке буде поміщений клас, а
потім поле Class (назва класу). Можна знехтувати назвою пакунка. У цьому
випадку буде створена безіменна група. Проте краще не ігнорувати поле
Package і давати пакетам осмислені імена, інакше через деякий час ви
отримаєте формений звалище із безіменних пакетів і файлів. І вже повірте, вам
доведеться грунтовно покопатися у вихідних текстах, щоб розібратися. Ми будемо
розсудливі і створимо окремий пакет Applets. Ви можете розміщувати там все
створювані аплети. Клас нашого аплета буде називатися скромно – Applet1.
Після введення цієї інформації ви побачите, що в полі File з'явиться повне ім'я
генерується файлу вихідного тексту аплета, включаючи повний шлях до каталогу, в
якому він буде розміщений. Це корисно для контролю правильності дій.

Тепер при бажанні можна скористатися трьома відзначається кнопками,
включають додаткові корисні можливості. Вибравши кнопку Generate header
comments, ви ініціюєте генерацію спеціального заголовка, що розташовується в
самому початку початкового тексту аплета. Заголовок містить загальну інформацію про
проекті, яка, на вашу думку, буде цікава тим, кому доведеться читати
ваші вихідні тексти. Ця інформація стане в нагоді і вам, якщо через деякий
час ви вирішите знову звернутися до старого проекту.

Наступна кнопка, Can run standalone, будучи включеною, призводить до генерації
статичного методу main (), в якому відбувається виклик класу аплета. Це вельми
корисно при налагодженні класу Java без застосування браузера. Крім того, ви
отримуєте клас, який може запускатися і як аплет, і як додаток. В
останньому випадку потрібно знайти на початку початкового тексту аплета опис
змінної:

boolean isStandalone = false;

і замінити його рядком:

boolean isStandalone = true;

Тепер ви можете запустити аплет як віконне додаток, використовуючи
Java-завантажувач з ім'ям java.exe або його налагоджувальну версію java_g.exe. Це
призведе до появи звичайного вікна класу Frame, всередині якого "вклеєна" аплет.
Чи не правда, зручний спосіб?

Остання кнопка, Generate standard methods, визначає, чи слід майстру
New Applet провести генерацію стандартних методів, властивих аплет: start (),
stop () і destroy (). Два перших викликаються при запуску і зупинці аплета
відповідно. Метод destroy () буде викликаний після того, як виконання аплета
зупинено, і об'єкт аплета повинен бути знищений. Як правило, ці методи
програмісти використовують для захоплення ресурсів та звільнення їх після закінчення
роботи. У нашому прикладі ми включаємо кнопку Generate standard methods для
створення каркаса методу start () – а навіщо він потрібен, стане ясно трохи пізніше. І
хоча це дрібниця, але з таких тактичних дрібниць складається успішна стратегія
програмування. Ввівши інформацію, натискаємо Next>, щоб перейти на
наступний етап генерації аплета.

Тепер займемося створенням програмного інтерфейсу передачі параметрів,
заданих в HTML-сторінці тегами <PARAM>. Ці теги є складовою
частиною тега <APPLET>, що визначає клас вбудованого аплета, його
місце розташування та іншу подібну інформацію.

До цього моменту ви вже повинні чітко уявляти собі, які параметри ви
хочете створити. Пропустивши хоча б один з них, згодом, завершивши генерацію
вихідних текстів, ви зможете додати параметри тільки вручну. Інтерфейс
діалогової панелі досить зрозумілий.

Почнемо з того, що введемо в поле Name ім'я планованого параметра – showFiles.
Якщо присвоїти йому значення True, то наш аплет проведе детальне сканування
файлової системи. У свою чергу значення False призведе до сканування тільки
на рівні каталогів, без урахування файлів. Далі визначимо тип створюваного
параметра. Очевидно, раз цей параметр може мати лише два стани, для нього
потрібно використовувати логічний тип boolean, який ви вибираєте з
розкривного списку в полі Type. Наступне поле Desc служить для введення
коментарів до параметрам. Загалом-то особливої ​​необхідності в його використанні
ні, але для порядку напишемо в ньому Show all (показати все). Якщо аплет буде
запускатися ким-небудь іншим, коментарі допоможуть визначити, для чого потрібен
той чи інший параметр. У наступному полі – Variable – потрібно вказати назву
змінної, в якій з'являється значення ліченого з HTML-сторінки
параметра. Оригінальний текст, що виробляє зчитування параметрів і запис їх в
зазначені вами змінні, генерується середовищем JBuilder автоматично. Щоб ім'я
змінної було і надалі зрозумілим, можна до нього додати префікс var –
varShowFiles. Даний спосіб створення імен є особистим винаходом автора,
яким він користується давно і знаходить його зручним. Ви ж можете задавати ім'я та
по-іншому, оскільки тут немає ніяких правил. Головне, щоб вам самим було
зрозуміло, для чого призначена та або інша змінна. Закінчивши створення
параметра, ми натискаємо на кнопку Next>. Якщо ж вам потрібен не один, а
кілька параметрів, то після введення інформації про кожного натисніть кнопку Add
Parameter і введіть дані для отримання наступного параметра.

Останні дії майстра Applet виробляють створення HTML-сторінки,
обрамлює наш аплет. Вона дозволяє протестувати роботу аплета за допомогою
браузера WWW або утиліти AppletViewer (входить в поставку як пакета JBuilder,
так і стандартного набору розробника JDK).

Для початку потрібно перевірити, відзначена кнопка Generate HTML Page. Якщо
вимкнути її, HTML-сторінка створена не буде. Потім введіть заголовок сторінки,
набравши його текст у полі Title. У наступному полі Name введіть ім'я, яке буде
присвоєно аплет. Через нього ви зможете посилатися на аплет з скриптових
програм (написаних на мовах управління об'єктами Web-сторінок) і програм на
мовою Java. Наш аплет ми назвемо просто – Applet1, проте ще раз нагадую про
необхідності привласнювати розумні імена. Параметри, вказані в полях Width і
Height, відповідальні за початковий розмір вікна аплета, а параметри в полях
HSpace і VSpace – за проміжок між вікном аплета і сусідніми з ним елементами
сторінки Web, список Align запропонує варіанти вирівнювання. Поле Codebase опишемо
окремо. Його значення не має відношення до геометрії. Їм задається
розташування файлу класу аплета. Це може бути повний URL-адресу сервера з
підкаталогів, де лежить відкомпільований файл завантаження аплета, або ж шлях
до нього щодо Web-сторінки, через яку аплет запускається. У найпростішому
випадку, коли і аплет, і його сторінка розташовуються в одному каталозі, в поле
Codebase потрібно ввести символ "." (Поточний каталог) або ж зробити його порожнім.
Коли всі поля заповнені, залишається лише натиснути кнопку Finish, щоб
згенерувати проект аплета з усіма його файлами.

У лівій верхній панелі AppBrowser відобразиться дерево щойно створеного
аплета:

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type"
CONTENT="text/html; charset=windows-1251">
<TITLE>
Applet1 Page
</TITLE>
</HEAD>
<BODY>
Applet1 will appear below
in a Java enabled browser.<BR>
<APPLET
CODEBASE = "."
CODE = "Applets.Applet1.class"
NAME = "Applet1"
WIDTH = 400
HEIGHT = 300
HSPACE = 0
VSPACE = 0
ALIGN = left
>
<PARAM NAME = "ShowFiles" VALUE = "False">
</APPLET>
</BODY>
</HTML>

Зверніть увагу: JBuilder, генеруючи вихідний текст Web-сторінки, врахував наші
локальні настройки і вказав у метапараметре заголовка обрану нами
кириличну кодування символів ANSI 1251:

<META HTTP-EQUIV="Content-Type"
CONTENT="text/html; charset=windows-1251">

Крім того, JBuilder коректно прописує ім'я класу аплета:

CODE = "Applets.Applet1.class"

Як бачите, ім'я вказано з урахуванням пакету, в якому зберігається клас, що
позбавляє нас від потенційної помилки, коли браузер не може виявити і
запустити аплет. А ось і параметр аплета, який був нами поставлене раніше:

<PARAM NAME = "ShowFiles" VALUE = "False">

Якщо тепер перейти на файл Applet1.java з вихідним текстом аплета, то
ви виявите перекритий метод getParameter (), який і зайнятий вийманням
параметрів з HTML-сторінки:

public String getParameter(String key, String def) {
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ?
getParameter(key) : def);
}

Зверніть увагу, що при запуску аплета в якості самостійного
додатки (згадайте відзначаємо кнопку Can run standalone) для читання
параметрів замість загальноприйнятого методу getParameter () застосовується читання
системних властивостей (properties). Але це ще не все. Всередину методу init () середовище
JBuilder додає рядок, який викличе перекритий метод getParameter (), а
отриманий результат призведе до заданого нами раніше типу параметра:

try {
varShowFiles = Boolean.valueOf(
this.getParameter("ShowFiles",
"True")).booleanValue();
} catch (Exception e) { e.printStackTrace(); }

Продовжимо роботу над створенням візуальної частини прикладом аплета. Клацніть на
закладці Design для входу у візуальний дизайнер. Клацніть на панелі компонентів
на піктограмі TreeControl і потім – на панелі. Компонент буде розміщений в
порожній панелі аплета. Потім у панелі, яку ви можете виявити в дереві
компонентів під ярликом this, потрібно змінити властивість layout на BorderLayout.
Це призведе до того, що компонент буде розтягнутий на всю панель.

А зараз саме час зайнятися самим вихідним текстом аплета. Перше, що
потрібно зробити, – відшукати кореневий елемент файлової системи, тому
напишемо для цього спеціальний метод:

private String findFSRoot() throws IOException
{
File appletDir = new File(".");
String curPath = appletDir.getCanonicalPath();
String root;
separator = File.separatorChar;
int index = curPath.indexOf((int)separator);
root = curPath.substring(0, index);
if(root.equals(""))
root = new String( new char[]{ separator });
return root;
}

Створимо об'єкт класу File, який буде відображати елемент поточного
каталогу (швидше за все, це "пісочниця", тобто каталог, відведений системою для
безпечного виконання аплета), тому конструктору об'єкта передається символ
".", Прийнятий у багатьох ОС як посилання на поточний каталог. Клас File потрібен для
того, щоб скористатися його методами, настільки зручними для виконання нашої
завдання. Це видно з другого рядка, де викликається метод getCanonicalPath (),
повертає повний шлях до поточного каталогу. Четвертої рядком визначається
символ-роздільник, використовуваний операційною системою користувача (а ми
поняття не маємо, де запущений аплет) для поділу каталогів при описі шляху.
Наступний рядок здійснює пошук першого від початку символу-роздільника в дорозі до
поточному каталогу, починаючи з якого метод substring () відріже залишок рядка.
Отриманий початковий фрагмент шляху є не що інше, як позначення кореня
файлової системи. Для тих операційних систем, у яких роль кореня виконує
символ-роздільник, як, наприклад, Unix, в передостанньому рядку значенням кореня
файлової системи присвоюється значення символу-роздільник. Отриманий кореневої
елемент повертається методом.

Тепер ми підібралися до найцікавішого місця – напишемо метод сканування
файлової системи. Йому в якості параметрів передаються: каталог, з якого
потрібно починати, посилання на компонент TreeControl і посилання на поточний вузол дерева
цього компонента:

private void enumDirTree(String dir,
TreeControl tree,
GraphLocation node)
throws IOException
{
int i;
String[] list;
File curDir = new File(dir);
GraphLocation curNode = ( node == null ) ?
tree.setRoot(dir):
tree.addChild(node, curDir.getName());
list = curDir.list();
for(i = 0; i < list.length; i++)
{
File tmp = new File(curDir, list[i]);
if(tmp.isDirectory())
{
enumDirTree(dir + separator + list[i],
tree, curNode);
}
else
{
if(varShowFiles)
tree.addChild(curNode, list[i]);
else continue;
}
if(node == null) tree.expand(curNode);
}
}

Спочатку метод enumDirTree () створює на базі переданого йому активного
каталогу об'єкт класу File. Потім відбувається перевірка переданого в параметрі
node вузла дерева (який являє собою посилання на клас GraphLocation) на
значення null. Якщо це так, то метод викликаний для кореневого каталогу, і
викликається метод setRoot () компонента TreeControl, що встановлює кореневої
елемент відображуваного дерева. В іншому випадку вважається, що метод
enumDirTree () вже був викликаний і переданий йому першим параметром каталог є
подветви кореня дерева і для його відображення викликається метод addChild (). Першим
параметром йому передається посилання на поточний вузол дерева, а другим – рядок з
ім'ям додається елемента. Правда, в процес вилучення цього імені
залучається метод getName () класу File. Він виділяє ім'я файлу або каталогу з
повного імені. Зверніть увагу, що і setRoot () і addChild () повертають після
додавання елемента дерева посилання на нього, яку ми зберігаємо до пори до
часу.

На наступному етапі викликається ще один цікавий метод класу File. Це
метод list (), що виробляє перерахування всіх елементів поточного каталогу та
повертає їх імена в масиві рядків. З цього моменту запускається цикл,
перебирающий повернуті елементи. Якщо черговий елемент масиву представляє
собою посилання на каталог, то enumDirTree () рекурсивно викликає сам себе, задавши в
як поточний каталог, переданий йому через параметр dir з доданим до
нього символом-роздільником і назвою каталогу, обраного з змінної list.
Останнім параметром передається посилання на останній доданий вузол каталогу,
збережений нами раніше. Потім процес повторюється.

Якщо вибраний з масиву елемент є простим файлом, потрібно перевірити
значення змінної varShowFiles, в яку при запуску аплета було записано
значення параметра ShowFiles. Якщо воно дорівнює false, то файл пропускається
оператором continue і цикл починає нову ітерацію. В іншому випадку вже
знайомий нам метод addChild () додає назва файлу в поточний вузол
відображуваного дерева компонента TreeControl. І на довершення всього остання
рядок методу перевіряє, чи не кореневої чи вузол дерева ми обробляємо. Якщо це
так, то він розкривається, щоб було видно гілки-піделементи кореневого вузла.
Дане додавання – чисто косметичне, але воно надає нашому аплет
професійний вигляд.

І ось, нарешті, дійшла черга до методу enumDirTree (). На думку автора,
кращого місця, де він повинен бути викликаний, ніж метод start (), просто не можна
придумати:

public void start() {
try
{
enumDirTree( findFSRoot(), treeControl1, null );
}catch (IOException x)
{ x.printStackTrace(); };
}

Тут, власне, напевно, все зрозуміло: методу enumDirTree () як
перший параметр (поточний каталог) передається повернутий методом findFSRoot ()
кореневої каталог, другий параметр – це посилання на компонент treeControl1,
яку середу JBuilder помістила у вихідний текст аплета в той момент, коли ми
поклали компонент TreeControl в панель, перебуваючи у візуальному дизайнера.
Останній параметр встановлюється рівним null, показуючи, що метод викликаний для
кореневого каталогу. Якщо бажаєте почати перебір з іншого каталогу, то передайте
його повна назва як перший параметр методу enumDirTree (), а третій
параметр все одно повинен залишатися null. Оскільки enumDirTree () щільно
працює з операціями вводу-виводу, то він розміщується в блоці try-catch, який
у разі збою перехопить управління.

Запустіть відкомпільований аплет, натиснувши комбінацію клавіш
<Shift> + <F9>. Автор навмисно не призводить вид працюючого класу.
Нехай це буде вашим "домашнім завданням": повторіть описаний проект і
подивіться результат самі. І ще. Якщо ви спробуєте запустити цей аплет з
допомогою браузера, то у вас нічого не вийде, оскільки менеджер захисту
віртуальної машини Java не дозволяє читати дискову інформацію на чужій машині.
Компанія Sun обіцяла, що в JDK 1.2 буде передбачена можливість
встановлювати рівні захисту за бажанням користувача. Поки ж ви можете
скористатися утилітою AppletViewer з комплекту JDK (у каталозі
JBuilderJava in). Для неї обмежень захисту не існує.


Отже, ми розглянули приклад створення аплета засобами JBuilder. Звичайно,
рекурсія, застосована нами, і часті перевірки дуже гальмують виконання коду.
Однак не варто звертати на це уваги. Головне, щоб ви зрозуміли, як працює
майстер Applet. А на наступному занятті ми поговоримо про створення віконних
додатків.

Створення віконного програми


Почну з того, що в попередньому розділі, пояснюючи, як створюються аплети, я
зазначив, що переглянути виготовлений приклад з допомогою браузера не вдасться
через недосконалість останніх і спрацьовування механізмів захисту. Проте вже
дещо встигло змінитися. На сервері корпорації Sun Microsystems
(Http://sun.java.сom) з'явився досить цікавий набір утиліт під назвою Java
Activator. Серед інших можливостей набір забезпечує заміну віртуальній
машини Java в браузерах Internet Explorer 4.x і Netscape Communicator 4.x
стандартної віртуальною машиною Java з комплектів Java Development Kit (JDK) і
Java Runtime Environment (JRE). Володіючи одним з них, можна використовувати їх
віртуальну машину для потреб Java Activator. Що це означає? А те, що аплет,
створений на попередньому занятті, можна все-таки побачити у вікні браузера, якщо
встановити Java Activator і відповідно до наявних інструкціями злегка
змінити Web-сторінку, в яку вбудований клас аплета. Механізм роботи Activator
дуже простий. Ви замінюєте посилання на аплет всередині Web-сторінки посиланням на
ActiveX (тег <OBJECT>) з дистрибутива Java Activator. При запуску ActiveX
відшукує стандартну віртуальну машину Java фірми Sun і передає їй ваш
аплет.

Однак повернемося до теми цієї глави: створення віконних додатків. Свою назву
вони отримали від того, що є незалежними і мають своє власне вікно
(Або кілька вікон) на відміну від аплета, який користується для свого
відображення вікном браузера. Віконним Java-додаткам дозволено дуже багато чого,
навіть те, що аплетів протипоказано, наприклад звернення до файлової системи
комп'ютера або маніпуляції з файлами і каталогами. А ще віконні програми
можуть мати своє власне меню, як і вікна будь-яких виконуваних програм, і
командне меню, для якого навіть запропонована піктограма в лівому верхньому кутку
заголовка вікна. Віконні програми з успіхом використовуються в інтрамережі
підприємств, де комп'ютери є елементами однієї мережевої файлової системи і
такі програми можна запускати з віддалених комп'ютерів. Хорошим прикладом
віконного програми можна назвати консоль Java браузера Netscape Communicator
4.x.

До речі, практично всі майстри пакета JBuilder також є віконними
додатками Java, про що свідчить піктограма з димлячої чашкою в
заголовку вікна. Таку піктограму віртуальна машина Java виводить за замовчуванням,
якщо ви не вказали ніякого іншого зображення для даного вікна.

JBuilder може виготовити віконне додаток трьома основними способами.
Перший ми обговорили на минулому занятті. На одному з етапів майстра New Applet ви
відзначаєте кнопку Can run standalone і отримуєте аплет, який можна запускати
як самостійне віконне додаток. Але це обхідний шлях. Другий метод:
викликавши майстер Frame, ви створюєте заготівлю віконного класу з усіма елементами.
Однак цей майстер не створює метод main (), який є точкою входу в віконне
додаток і найчастіше запускає клас вікна. Оптимальним, на мій погляд,
є третій метод, що пропонує використовувати майстер New Application. З його
допомогою ви отримаєте повноцінне віконне додаток, готове до запуску.

Для того щоб скористатися майстром New Application, створимо дуже
компактний редактор системних файлів Autoexec.bat і Сonfig.sys, відповідний
таким умовам:


JBuilder створює віконне додаток в два етапи. Спочатку запустіть майстер
Application командою File New Application. На екрані виникне панель з уже
знайомими нам полями Package і Class. Щоб отримати заголовний коментар у
початку файлу, дозволите відзначаємо кнопку Generate header comments.

Необхідно зазначити, що JBuilder при створенні віконного програми формує
окремо два класи: клас вікна і клас програми. Клас вікна управляє
відображенням вікна програми і його візуальних елементів, тоді як клас
програми є запускається частиною, яка після старту показує вікно,
розміщуючи його в центрі екрана. Це допомагає зробити вихідні тексти програми
модульними і більш придатними для читання.

На другому етапі визначимо ім'я класу вікна програми (у полі Class) і напис
на заголовку вікна (поле Title). Про інші параметри поговоримо окремо.

Це п'ять відзначаються кнопок діалогової панелі, які завідують створенням
додаткових можливостей при генерації вихідного тексту віконного класу.

 Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height)
frameSize.height = screenSize.height;
if (frameSize.width > screenSize.width)
frameSize.width = screenSize.width;
frame.setLocation((screenSize.width –
frameSize.width) / 2,
(screenSize.height – frameSize.height) / 2);
frame.setVisible(true);

Зміна призначеного для користувача інтерфейсу


Отже, запустивши майстер Application, задавши ім'я класу програми SysEditApp і
ім'я класу вікна SysEditFrm, визначивши напис заголовка вікна "System Files
Editor "і включивши всі п'ять відзначаються кнопок, ми створили програму.

Якщо отриманий результат вас влаштовує, процес завершено. Якщо ж інтерфейс
хочеться поміняти, діємо далі. В області переходів виділіть файл, в якому
розташовується клас вікна, і клацанням на закладці Design запустіть візуальний
дизайнер, але насамперед приберіть малюнки з кнопок швидкого доступу. Для цього в
вікні інспектора поміняйте значення властивості buttonType на textOnly. Таким
чином, всі малюнки з кнопок будуть прибрані і замість них з'являться написи,
задані властивістю labels. Його значення теж потрібно змінити. Клацніть на рядку
labels у вікні інспектора і в діалоговому вікні, натиснувши на кнопку
Remove, приберіть всі наявні рядка. Потім два рази натисніть кнопку Add, щоб
додати два нові елементи, після чого подвійним клацанням по черзі переведіть їх
в режим редагування і змініть текст на Autoexec.bat і Config.sys,
відповідно. Коли ви натиснете на кнопку OK, то побачите, що вид кнопок
змінився. Картинки зникли, з'явилися назви, введені нами, а самих кнопок
стало дві – по числу текстових рядків, введених в поле властивості labels.

Тепер нам потрібно створити поле редагування. Для цієї мети добре
підійде компонент TextAreaControl з палітри Controls. Але перш ніж додавати
його, видаліть велику панель в центрі вікна. Вона була створена JBuilder
автоматично, хоча ми в ній і не потребували. Непотрібний компонент – це баласт,
який лише уповільнює роботу програми і забирає ресурси. Замість віддаленій
панелі ми розмістимо компонент TextAreaControl, який займе весь вільний
місце у вікні – від панелі кнопок швидкого доступу до панелі статусу. Якщо цього
не відбулося, варто перевірити значення властивості constraints – воно має
містити значення Center. На закінчення у доданого компонента змініть
значення властивості enabled на False. Цим ми відключимо компонент, і користувач
не зможе нічого написати у вікні редактора до тих пір, поки не завантажений
який-небудь із системних файлів.

Ми ледве не забули змінити зовнішній вигляд діалогової панелі About так, щоб
відображалася інформація про нас. На жаль, в візуальний редактор саму
діалогову панель завантажити не вдасться. Однак ми можемо зробити це за допомогою
вихідного тексту ініціалізації класу панелі, для чого доведеться повернутися з
візуального дизайнера в редактор і виправити кілька рядків. В описі класу
SysEditFrm_About знайдіть рядки з показуваної текстовою інформацією та змініть
їх приблизно наступним чином:

 String product = "System Files Editor";
String version = "0.99.a";
String copyright = "Copyright (c) 1998";
String comments = "Користуйтеся на здоров'я!";

Звичайно, ви можете самі задати необхідні тексти, а пропонований варіант
служить лише прикладом.

Ви звернули увагу, що JBuilder зарезервував вільне місце під символ
вашої фірми чи щось подібне? Однак самого зображення немає. Щоб додати
його, розшукайте в методі jbInit () панелі About рядок:

imageControl1.setImageName("");

Ця "пустишка" спеціально залишено, щоб ми могли вказати ім'я графічного
файлу в форматі JPG або GIF. Намалюйте свій логотип і збережіть його як
logo.gif, а показану вище рядок установки логотипу змініть наступним
чином:

imageControl1.setImageName(".logo.gif");

На цьому процес виготовлення користувальницького інтерфейсу завершено, і пора
переходити до створення програмної "начинки".

Пишемо вихідний текст


Для початку визначимо, які обробники подій потрібні для виконання
технічного завдання. Перший і головний обробник повинен спрацьовувати при натисканні
кнопок на панелі швидкого доступу. Очевидно, це буде обробник події
actionPerformed компонента ButtonBar. Другий обробник перехоплює подія
actionPerformed, що приходить від головного меню програми в той момент, коли
користувач вибрав команду меню File Exit. І третій обробник повинен
викликатися, якщо користувач закриває вікно не через меню, а за допомогою
системного меню вікна або кнопки закриття. Цим вимогам цілком відповідає
подія windowClosing, що виникає при закритті вікна, але ще до його знищення.
Перед початком основної роботи зі створення вихідних текстів додайте в опис
класу вікна змінну-поле, яка буде зберігати ім'я відкритого для
редагування файлу:

String fileName = null;

Почнемо з першого обробника actionPerformed компонента ButtonBar. Відкрийте
візуальний дизайнер для класу вікна і зробіть подвійне клацання мишею на цьому
компоненті. JBuilder перенесе вас в редактор вихідного тексту, де для вас вже
виготовлений порожній обробник необхідного події. Ми з вами будемо набирати його
вихідний текст поступово і коментувати фрагмент за фрагментом. Для
виконання поставленого завдання потрібно дві змінних. Одна буде
використовуватися для тимчасового зберігання лічених байт інформації, а друга,
клас StringBuffer, – для зберігання і форматування тексту:

 void buttonBar_actionPerformed(ActionEvent e) {
int tmp;
StringBuffer buff = new StringBuffer();

Далі потрібно перевірити, чи було присвоєно полю fileName ім'я редагованого
файлу. Якщо значення fileName одно null, то це означає, що у вікні редактора
немає відкритого файлу. Якщо ж файл був відкритий, то його необхідно зберегти,
викликавши метод saveFile (), про яке буде сказано далі:

if( fileName != null ) saveFile();

Тепер, коли вжиті всі запобіжні заходи, потрібно визначити, яка
з кнопок на панелі швидкого доступу була натиснута. Структура ActionEvent,
передана обробникові події actionPerformed, має у своєму складі поле
actionCommand, що містить напис, який ви бачите на натискаємо кнопку. Його
можна витягти методом getActionCommand ():

fileName = e.getActionCommand();

Правила хорошого тону програміста вимагають від нас створити резервні копії
редагованих файлів. Отже, потрібно відкрити потік висновку, що є на
Насправді файлом, ім'я якого аналогічно імені файлу, що завантажується в редактор,
але з додатковим розширенням. bak:

   try
{
FileWriter backup = new FileWriter(
new File ("c:", fileName + ". bak"));

Тепер відкриємо редагований файл:

     InputStreamReader source = new InputStreamReader(
new FileInputStream("c:" + fileName));

і байт за байтом перепишемо дані з оригінального файлу в резервний:

     while(true)
{
if( (tmp = source.read()) == -1 ) break;
backup.write(tmp);
}

Після закінчення копіювання дані потоку виводу повинні бути скинуті на диск, а
сам потік слід закрити:

    backup.flush();
backup.close();

Може так статися, що у вашій системі не можна скинути покажчик поточної
позиції файлу на початок, і тоді можливий лише один спосіб, а саме – закрити
потік і відкрити його знову:

     source.close(); 

source = new InputStreamReader(
new FileInputStream("c:" + fileName));


Для зручності ми будемо читати дані з потоку файлу у послідовну буфер,
додаючи лічені байти один за одним:

while(true)
{
if( (tmp = source.read()) == -1) break;
buff.append((char)tmp);
}

А коли весь файл лічений, текст у буфері приводиться до типу String і
завантажується у вікно редактора шляхом присвоєння його властивості text:

    textArea.setText(buff.toString());

Залишається дозволити редагування тексту у вікні і закрити редагований файл:

     textArea.setEnabled(true);
source.close();
} catch( IOException x )
{ x.printStackTrace(); }
}

Перш ніж ми перейдемо до написання наступних двох обробників, зробимо
спеціальний метод, який буде зберігати змінені дані. Такий метод
необхідний, оскільки обробники закриття вікон будуть викликати його для збереження
файлів після редагування. Отже, перше, що повинен робити метод saveFile (), –
перевіряти, чи є відкритий файл, а якщо такого немає, він просто завершує свою
роботу: void saveFile () {if (fileName == null) return;


Відкриємо файл, запишемо дані з вікна редагування, після чого скинемо потік
і закриємо його:

     try
{
FileWriter os = new FileWriter(
new File("c:", fileName));
os.write(textArea.getText());
os.flush();
os.close();

Щоб відзначити закриття редагованого файлу, привласнимо полю fileName значення
null, а заодно очистимо вікно редактора і відключимо режим редагування:

       fileName = null;
textArea.setText("");
textArea.setEnabled(false);
}
catch( IOException x )
{ x.printStackTrace(); }
}

Повернемося до обробникам actionPerformed і windowClosing. Перший з них
створюється автоматично, якщо ви дозволили генерацію головного меню програми,
зазначивши кнопку Generate menu bar в процесі взаємодії з майстром
Application. Що ж стосується другого обробника, то його потрібно створити вручну в
вікні інспектора об'єктів. У самий початок і першого і другого обробника
додайте рядок збереження даних:

saveFile();

Отже, програма готова, і її можна випробувати в дії.

Залишається залагодити маленьку проблему. Вона не торкнеться програмістів,
користуються середовищами JBuilder і JDK. Але досить велика частина Java-спільноти
запускає програми в середовищі Windows і застосовує в роботі утиліти з
привабливого набору Microsoft Java SDK. Якщо ви користуєтеся утилітами jview
і wjview, вам загрожує неприємна ситуація: при виклику команди Help About замість
очікуваної діалогової панелі з інформацією про продукт ви побачите один заголовок.
Більш того, це призводить до повної блокування програми. Не варто звинувачувати в цьому
пакет Microsoft Java SDK, швидше навпаки: з його допомогою ми змогли виявити
внутрішню помилку бібліотеки класів. Якщо в момент запуску jview заглянути в
консольне вікно, то можна побачити на екрані повідомлення про помилку: параметр
constraint менеджера BorderLayout не може бути рівний null. Подивившись все
вихідні тексти бібліотеки Java, я так і не знайшов помилку. Як видно,
причина криється всередині архіву classes.zip, де упаковані відкомпілювалися
класи бібліотеки. Однак із зазначеною проблемою можна легко справитися. У класі
SysEditFrm_AboutBox розшукайте метод jbInit (), а в ньому рядок:

this.add(panel1, null);

Другий параметр методу додавання панелі повинен містити рядок, що говорить
про передбачуване місце розташування вставляється в діалогову панель елемента. Якщо
встановлено значення null, то менеджер розташування використовує значення по
замовчуванням (що й підтвердилося вивченням вихідних текстів). Однак віртуальна
машина Java від Microsoft цього не робить, тому потрібно явно вказувати
місце розташування додається компонента. У нашому прикладі це буде "Center":

this.add(panel1, "Center");

Ці операції повністю знімають небажаний ефект.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*