Собираем урожай JavaBean-компонентов

Т

Еперь наступило время собирать плоды нашего труда. В этой главе мы увидим, как создавать некоторые очень простые bean-компоненты, которые могут облег­чить жизнь программисту.

Умение создавать элементы управления, описанные в этой главе, представляет собой значительную часть навыков работы с JavaBean-компонентами вообще. Java позволяет легко создавать визуальные компоненты. В этой главе вы увидите, на­сколько легка в выполнении эта задача, и как много вы сможете приобрести от изу­чения принципов работы технологии.

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

Упаковка Swing-классов

Если вы запускали на выполнение программы из сопровождающих книгу мате­риалов, ВЫ, Несомненно, столкнулись С компонентом ElfLietBox. Он хранится в пакете comp JAR-файла Codebox Вместе с компонентом Eifciock, разработкой кото­рого вы будете заниматься в последующих главах. В этой главе вы займетесь компо­новкой локальной копии компонента ElfLietBox. Под "локальной" имеется в виду то, что эта копия компонента не будет находиться в файле Codebox. Jar или в паке­те Com.Elvenware.

Если вы пришли из мира Delphi или VB, то наверняка обратили внимание на то, что некоторые элементы управления Swing ведут себя не так, как многие популяр­ные визуальные компоненты, используемые в других языках. Основная причина заключается в том, что архитектура Swing построена по типу модель-представление — событие (model-view-event). Например, вы не можете просто протестировать свой­ство флажка, чтобы получить информацию о его текущем состоянии. Вместо этого, для исследования состояния элемента управления вы откликаетесь на события и проверяете параметры сообщений. При работе с JLiet Вы не можете автоматически добавлять или удалять элементы списка, не создав сначала свой собственный класс DefaultLietModei Или нечто подобное. В Swing почти все компоненты являются или моделями, или событиями. В VB и Delphi нет компонентов с архитектурой мо — дель-представление-событие. Напротив, все они существуют как один полностью интегрированный компонент.

Если вы предпочитаете тот способ, который используется в Delphi или VB, не так сложно изменить поведение существующих Java-компонентов, чтобы они соот­ветствовали вашим ожиданиям. Разработчики Java проделали большую работу, что­бы вы могли делать такие изменения.

Класс ElfListBox

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

Для того чтобы самостоятельно создать тестовую программу и компонент, снача­ла потребуется создать стандартный Java-аплет, как описывалось в главе 3.

Код, который вы будете разрабатывать, основывается на файлах, хранящихся в JAR- файле Codebox В сопровождающих материалах. В результате, вам нужно будет либо включить JAR-файл Codeboχ В проект как библиотеку, либо сделать так, чтобы путь к источнику для вашего проекта указывал на исходный код разработанной мною библио­теки codebox. В данном случае более предпочтительным является первый метод.

примечаниеКак вы помните, библиотека добавляет JAR-файл или пакет в путь классов. Если необходимо, выберите в меню пункт Tools ∣ Configure Libraries, чтобы можно было установить библиотеку. Ключевой этап этого процесса заключается в указании мес­торасположения файла Codebox. Jar, Как показано на рис. 34.1.

Вам может быть непонятно, как можно использовать файл codebox. jar во время повторного создания локальной копии одного из компонентов, хранящихся в файле codebox. jar. В дереве com. elvenware, хранящемся в файле codebox. jar, имеется ветвь с названием codeboχ, где хранятся служебные программы, а также ветвь, называющаяся comp, в которой хранятся компоненты. Компоненты, созданием которых вы вскоре займетесь, основаны на служебных программах, которые размещаются в па­кете утилит com. elvenware. codebox. Поэтому для того чтобы можно было получить доступ к служебным программам, нужно получить доступ к файлу codebox. jar. Пока что вы можете просто игнорировать фрагмент comp JAR-файла. Другими словами, вы будете импортировать com. е Ivenware. codebo×. *, но не будете импортировать Com.Elvenware. сотр.*.

Рис. 34.1. Настройка библиотеки Codebox. Обратите внимание, что в качестве расположения библиотеки (поле Location) Выбрано User Ноте, а в списке путей библиотек (Library Paths) Указан путь к соответствующему JAR-файлу

700

Процесс добавления библиотеки в JBuilder описан в части V, "Управление проек­тами", и в файле Index.Html В сопровождающих материалах. Затем следует выбрать пункт Project, Project Properties, чтобы добавить библиотеку codebox в текущий про­ект, как показано на рис. 34.2. Добавляя библиотеку, вы помещаете данный JAR — файл или пакет в путь классов текущего проекта.

Теперь все готово к добавлению в тестовый проект ElfListBox. Чтобы эта версия отличалась от версии, хранящейся в CodeBox. Jar, Назовите ее MyEifListBox. Выбе­рите в меню пункт File ∣ New ∣ JavaBean и добавьте в текущий пакет Ьеап-компонент. Если вы нажмете кнопку эллипсиса, находящуюся справа от поля Package, как по­казано на рис. 34.3, будет вызвано диалоговое окно Select a Package (Выберите па­кет), где можно будет выбрать пакет, в котором находится ваш элемент управления.

примечаниеВ данном случае должна быть только одна опция, Elfiistboχ. После этого появляется диалоговое окно JavaBean Wizard (Мастер JavaBean-компонент), как показано на рис. 34.3. Обратите внимание на то, что пакет, выбранный на рисунке, называется Eiflistbox, И компонент является потомком класса Javax.Swing.JList И НОСИТ ИМЯ MyElfListBox.

Iiisaiiii-Xiaiiiin Одна из вещей, которая делает программирование настолько увлека­тельным, состоит в том, что существует множество путей достижения одной и той же цели. Я сделал так, что MyElfListBox является потомком класса JList. Альтернатив­ный метод заключается в том, чтобы предком данного класса сделать класс JComponent, a JList превратить в поле компонента. Затем мог бы воспользоваться Beanlnfo-файлом и свойствами упаковщика для того, чтобы сделать видимыми некоторые скрытые поля класса JList. Последний метод является более сложным, однако он обеспечивает большую гибкость. Исследованию объектов этого типа можно посвятить отдельную главу в книге по созданию визуальных элементов управления. Но в этой кни­ге мне приходится ограничивать охват темы и не усложнять описание. Однако вам следу­Ет изучить такие возможности для своих элементов управления.

рис. 34.2. настройка jbuilder, которая обеспечивает нахождение пакета сот.elvenware.codebox, а также всех входящих в него компонент
f rojett properti. s
pmhsi
⅛0k jtaval 3.1 ь24
oulpuipavi.
bsckup path. j6τ8rcjavaflbboowjavabeansjeitllstboxlbal(
,∣gtsrcj svajjbbookuavaboansjetflistboxlciasses

⅛v0rtαn5 ouactory. ∣0 tsrcjavaflbboolguavabeansjeiiustbox
bpurea i uocumβπt-'0" raquiredlibraflee j codabox
№ 1, vabean wizard,creataanawjanbarai,fih inswselds betowlo setttiepaclefle, iɪanw, base class, and other options forms javabaan wtimh wbi sa treated.,i Γ oeneretatneimwthod j p oaneratnheadnrcgmments,г oenarme sample propers
'r∙rrι<.'
o⅛β* wormatlon ....' ^< ‘“3
package jelffistbox 
mass name, ^reitlistbox t
bfsedasa iiavaxswinojllst ɪj eɪjlj
f attow ρn⅛⅛avaβaaπ⅛ .. ...j
opttons 
f p¾tt*
к ∙' poe n∙ratedeftu∣t coiretnictor
∙.^*s∙
рис. 34.3. внешний вид окна мастера javabean-компонент во время создания ьеап-компонента

Исходный код, сгенерированный JBuilder, выглядит примерно следующим образом:

Public class MyElfListBox extends JList <

BorderLayout borderLayoutl = new BorderLayoutO ; public MyElfListBoxO {

Try

{

Jblnit() ;

)

Catch(Exception ex)

{

Ex. printStackTrace();

)

)

Private void jbɪnit() throws Exception {

This. SetLayout(borderLayoutl);

)

)

Это та основа, на которой вы можете создавать свой компонент. Сам компонент показан в листинге 34.1.

Листинг 34.1. EIfListBox Связывает в один компонент DefauItListModeI И JList

Package elflistbox;

Import java. awt.*;

Import java. util.*;

Import javax. swing. *;

Import com. elvenware. codebox.*;

Public class MyElfListBox extends JList

{

Private BorderLayout borderLayoutl = new BorderLayout(); private DefaultListModel list ≈ new DefaultListModelO; public MyElfListBox()

{

Super(); try (

Jblnit () ;

)

Catch(Exception e)

{

E. printStackTrace();

)

This. SetModel(list) ;

}

Private void jbɪnit() throws Exception (

)

Public void addstring(String value)

{

List. addElement(value); this. repaint();

Public void addString(String value, boolean scrollToEnd)

{

AddString(value);

Rectangle r= getCellBounds(list. size() — 1, list. size() -1) ;

ScrollRectToVisible(r);

)

Public void clear()

{

List. clear();

)

Public void deleteCurrentItem()

{

Int SelectedItem ≈ getSelectedlndex();

Iiet. remove (SelectedItem);

)

Public String getSelectedString()

{

Int SelectedIndex = getSelectedlndex(); if (SelectedIndex! = -1)

Return (String)Iist. get(SelectedIndex);

Else

Return "";

}

Public void remove(int value)

{

List. remove(value);

)

∕**

* θdeprecated Используйте вместо этого GetString *

* θparam Value Добавьте эту строку в окно списка */

Public void setstring(String value)

{

AddString(value);

}

Public String getString(int i)

{

Return (String)list. get(i);

)

Public ArrayListStream getArrayList()

{

ArrayListStream arrayLiβt = new ArrayListStreamO ; for (int i = O; i < list. size(); i++)

ArrayList. add(list. get(i)); return arrayLiεt;

)

Public DefaultListModel getList()

(

Return list;

)

Public void setList(DefaultListModel list)

(

This. Iiat ≈ list;

)

Public void setVisible(boolean visible)

{

Super. setVisible(visible);

Public void SatArrayLiat (ArcayList list) (

String value;

Iterator itr = list. iterator(,; while (itr. hasNext())

(

Object obj ≈ itr. next(); if (obj Instanceof String)

{

Value = (String)obj;

)

Else

{

Value = obj. toString();

)

This.List.AddElement(Value);

Ключевыми строками кода здесь являются те, которые добавляют DefaultListModel В JList:

Private DefaultListModel list = new DefaultListModelO; public ElfListBoxO {

This.SetModel(List);

}

Как только вы присоедините свою копию DefaultListModel к окну списка, можно приступать к созданию самого окна списка, которое работает так же, как и окно списка из Delphi:

Public void addString(String value)

{

List. addElement(value); this. repaint();

)

Public void addString(String value, boolean ScrollToEnd)

{

AddString(value);

Rectangle r= getCellBounds(list. size() — 1, list. size() -1); ScrollRectToVisible(r);

)

Эти два метода класса ElfListBox позволяют легко добавить строку в окно спис­ка или добавить строку, а затем прокрутить список в конец.

Чтобы точно увидеть, как они работают, необходимо правильно настроить тесто­вую программу. Переведите фокус в редакторе на главный метод своего аплета или на Framel Своего приложения, и переключитесь в режим конструирования. Размес­тите в главном окне своей программы панель JScrollPane, Которая находится на закладке Swing Containers палитры компонентов. Воспользуйтесь Bean Chooser, чтобы выбрать EIfListBox, как показано на рис. 34.4.

После того как в диалоговом окне Bean Chooser вы укажете месторасположение bean-компонента и щелкнете на кнопке OK, вы можете просто нарисовать свой эле­мент управления в верхней части JScroIIPane, как вы бы рисовали любой другой компонент. Теперь добавьте JPaneI в панель содержимого своего главного окна и по­местите несколько кнопок на элемент управления. В конечном итоге, вы пытаетесь создать интерфейс, показанный в аплете на рис. 34.5. Если у вас возникли пробле­мы с компоновкой этого интерфейса, прочитайте главы из части HI или просмотри­те исходный код программы-примера, которая входит в состав сопровождающих книгу материалов (см. каталог EifListBox).

Щелкните на кнопке AssignStrings (Присвоить строки), показанной на рис. 34.5, и создайте обработчик событий, код которого показан ниже:

Void jButtonAssignStrings_actionPerformed(ActionEvent Е)

{

For (int i = O; i < 100; i++)

I

SlfListBoxl. addString("Elf—" + String. valυeθf(i));

)

I

Показанный здесь код позволит вам быстро добавить в EifListBox IOO строк (см. рис. 34.5). Вот так! Это очень похоже на поведение, которое мог ожидать от окна списка Delphi-программист. Чтобы начать добавление строк в окно списка, просто поместите на окно элемент управления и воспользуйтесь одним вызовом функции с именем вроде Addstring. ElfListBox Также прост в использовании, как и System.Out.Println, А может быть и немного проще. Если вы считаете, что в Java-программах окна списка работают намного быстрей, чем средства стандартного вывода, то вот вам, как разработчику, и определенные возможности по их совершен­ствованию.

рис. 34.4. использование диалогового окна bean chooser рис. 34.5. вот так выглядит elflistbox после щелчка на кнопке assignstrings

Окна списков, списки массивов и потоки

Еще одна вещь, которую вы можете сделать с окном списка, заключается в том, чтобы быстро и легко добавить в него массив строк во время выполнения. Я добавил поддержку списков в класс ElfListBox, чтобы предложить вам простую в использо­вании функцию:

Public ArrayListStream getArrayList()

{

ArrayListStream arrayList = new ArrayListStreamO; for (int i = O; i < list. size() ; i++>

ArrayList. add(list. get(i)); return arrayList;

}

Public void SetArrayList(ArrayList list)

{

String value;

Iterator itr = list. iterator(); while (itr. hasNext())

{

Object obj = itr. next(); if (obj instanceof String) t

Value= (String)obj;

}

Else

{

Value = obj. toString();

)

This. list. addElement(value);

}

примечание}

Класс ArrayListStream является частью JAR-файла codebox. Как го­ворилось выше, этот код нельзя будет откомпилировать, если вы не добавите файл codeboχ. jar в закладке Required Libraries диалогового окна Project Properties. Биб­лиотека представляет собой технологию, которую использует JBuiIder для помещения файлов в пути классов. Вы можете установить библиотеку с использованием пункта меню Tools I Configure Libraries. Вы можете воспользоваться библиотекой в своем те­кущем проекте, выбрав в меню команду Project ∣ Project Properties, после чего потребу­ется перейти на закладку Required Libraries и щелкнуть на кнопке Add (Добавить). Если вам нужна помощь при работе с библиотеками, читайте часть V, "Управление проекта­ми". Вам нужно будет добавить два оператора import в верхнюю часть своего класса. Они должны выглядеть так:

Import com. elvenware. codebox.*; Import java. io.*;

Методы SetArrayLiSt И getArrayList ПОЗВОЛЯЮТ легко ДОбаВИТЬ В ОКНО СПИСКЭ список массивов ArrayList, состоящий из строк или других элементов, и преобра­зовать список, связанный С окном списка, B ArrayList.

В результате, вы можете написать код, который выглядит следующим образом:

Void jButtonAssxgnList_actionPerformed(ActionEvent e)

<

ArrayListStream list = new ArrayListStreamO ;

List. add("Beorn");

ElfListBoxl. SetArrayList(list) ;

)

Конечно же, повод написать подобного рода код в промышленном приложении вряд ли когда-нибудь возник бы, но вы можете видеть, насколько легко можно зас­тавить ArrayList работать C ElfListBox.

Одной из отсутствующих функций в этом классе является возможность простого чтения текстового файла и вывода его в окне списка. Это та задача, которую мне приходится выполнять во время своей работы довольно-таки часто, и поэтому я в помощь себе создал класс ArrayListstream. Этот класс, находящийся в файле codebox. jar И В Пакете com. e Ivenware. codebox, является ПОТОМКОМ Класса ArrayList, подобно тому, как ElfListBox является потомком класса JList. Весь класс целиком можно найти в листинге 34.2.

Листинг 34.2. Класс ArrayListStream

package com.elvenware.codebox; import java.utxl.arraylist, java.util.iterator; java.io.printwriter; java.io.filewriter; java.io.filereader; java.io.ioexception; java.io.bufferedreader; j avax.swing.*;,import import import import import import import ∕**,* title:
* description:
,массив строк, который может быть записан и считан из текстового файла copyright (с) 2001,* copyright
* conpany:
* @author
* ^version */
public class (
public <
}
public void store(string filename) (
,charlie
0.2
,calvert,arrayliststream extends arraylist
arrayliststream()
,filewriter fw = null;
printwriter pw = null;
try
{
fw = new filewriter(filehame); pw = new printwriter(fw); iterator itr = this.iterator(); while (itr.hasnext())
{
string s = (string)itr.next(); pw.println(s);
}

Catch(IOException Е )

<

System. out. println(e);

}

Finally

{

Try

{

//pw. close(); fw. close () ;

}

Catch(IOException e)

{

System. out. println(e);

}

}

}

Public boolean load(String fileName)

{

If (!FileBox. fIleExists(fileName))

существует");{

JOptionPane. ShowMessageDialog(null, "Файл не Return false;

)

FileReader fr =≈ null ;

BufferedReader br = null;

String inString; try

{

Fr = new FileReader (fileName) ;

Br = new BufferedReader (fr) ;

While ( (inString = br. readl>ine ()) != null)

{

This. add(inString);

}

}

Catch(IOException e)

{

System. out. println(e);

)

Finally

{

Try

{

F r. close () ; br. close();

}

Catch(IOException e)

(

System. out. println(e);

)

}

Return true;

Основные функции класса ArrayListstream Реализуются при помощи методов загрузки и сохранения, которые используют функциональность потоков Java для чте­ния текстового файла с диска и для записи текстового файла на диск. Идея, безусловно, заключается в том, чтобы текстовый файл автоматически упаковывался в ArrayList.

В конечном итоге мы может записать код, который выглядит примерно так:

Void jButtonBrowse_actionPerformed(ActionEvent Е)

{

JFileChooser fileChooser = new

JFileChooser(FileBox. getCυrrentDirectory());

If (fileChooser. ShowOpenDialog(this) ==

JFileChooser. APPROVE_OPTION)

{

ArrayListStream IistStream = new ArrayListStreamO ; try {

IistStream. load(fIleChooser. getSelectedFile().getCanonicalPath());

)

Catch (IOException ex)

{

Ex. printStackTrace();

)

ElfListBoxl. SetArrayList(IistStrecim) ;

}

примечание}

B JBuiIder вы не должны вручную вводить блоки try.. catch или добав­лять выражение типа import java. io.* в верхнюю часть своего файла. Вместо этого щелкните правой кнопкой мыши на выражении, которое следует внести в try-блок, и вы­берите в контекстном меню пункт Surround with try∕catch (Внести в try/catch-блок). В вашу программу будет автоматически вставлен блок try.. catch, а в верхнюю часть Файла будут помещены все необходимые операторы Import.

Если удалить блок try..catch из этого метода, несложно заметить, что он со­стоит ИЗ Нескольких строк кода, В которых вызывается JFileChooser, что предос­тавляет пользователю возможность выбрать текстовый файл. Затем используется класс ArrayListstream, с помощью которого выполняется загрузка файла с диска и его ВЫВОД В ElfListBox:

ArrayListStream IistStream = new ArrayListStreamO ;

IistStream. load(fHeName); ElfListBoxl. SetArrayList (IistStream) ,*

На рис. 34.6 показан конечный результат загрузки поэмы с диска и ее вывода в EifListBox Функциональность подобного рода — это то, что современные разра­ботчики визуальных компонентов ожидают от инструментальных средств разработ­ки. Поражает, насколько просто осуществить преобразование Swing-классов Java в компоненты, которые работают таким интуитивным и простым образом.

Говоря так, я вовсе даже не намекаю на то, что я умнее разработчиков из компа­нии Sun. Наоборот, я пытаюсь сказать, что компания Sun разработала эти классы та­ким образом, чтобы их было очень легко расширять, что я и сделал в этой главе. Если вы — программист на Java, то возьмите инструменты, предоставленные вам
компанией Sun, и заставьте их работать с помощью показанных здесь простых ме­тодов.

Компонент ElfscroIlListBox

Возможно, самый большой недоста­ток класса EifListBox заключается в том, что он все еще заставляет вас добав­лять JScrollPane. А что если вы собира­етесь создать окно списка, и при этом вам не нужно, чтобы оно прокручивалось?

рис. 34.6. вывод поэмы в компоненте elflistbox с помощью класса arrayliststreamПростейшим решением этой проблемы будет расширение класса JScrollPane, А не EifListBox. Пример того, как это сде­лать, показан в листинге 34.3. Програм­ма-пример, демонстрирующая как ис­пользовать компонент, находится в каталоге ElfScroliList среди сопровождаю­щих книгу материалов.

Листинг 34.3. Комбинирование классов JList и JScroIIPane в ElfscroIIListBox

Package elfscrolllist;

Iɪnport java. awt.*;

Import javax. swing.*;

Public class MyElfscrollListBox extends JScrollPane

{

BorderLayout borderLayoutl = new BorderLayoutO;

JList jListl = new JList() ;

Private DefaultListModel list ≈ new DefaultListModelO; public MyElfscrollListBoxO {

Try

{

Jblnit();

}

Catch(Exception ex)

{

Ex. printstackTrace();

}

)

Private void jbɪnit() throws Exception {

∕∕ Следующая строка закомментирована, чтобы не изменять свойство ∕∕ Layout Компонента JScrollPane //this. setLayout(borderLayoutl);

This. getViewport().add(jListl, BorderLayout. CENTER); jListl SetModel(Iist);

}

Public void addstring(String value)

{

List. addElement(value); thΛs. repaint();

}

)

Листинг 34.3 показывает довольно усеченную версию ElfListControl. Вы може­те видеть, что данный компонент порожден от JScroilPane и содержит экземпля­ры классов JList И DefaultListModel:

Public class ElfscrollListBox extends JScrollPane

{

BorderLayout borderLayoutl = new BorderLayout();

JList jListl = new JList () ;

Private DefaultListModel list = new DefaultListModelO;

Метод jbinit был модифицирован таким образом, чтобы не изменялось свой­ство Layout класса JScrollPane, и чтобы обеспечивалась инициализация свойства Model класса JList:

Private void jbɪnit() throws Exception {

∕∕ Следующая строка закомментирована, чтобы не изменять свойство ∕∕ Layout компонента JScrollPane //this. SetLayout(borderLayoutl);

This. getViewport().add(JListl, BorderLayout. CENTER); jListl. setModel(list);

}

B конечном итоге, в элемент управления был вставлен метод addstring, чтобы затем можно было быстро и легко разместить и заставить работать экземпляр дан­ного компонента:

Public void addString(String value)

{

List. addElement(value); this. repaint();

)

Использование компонента — это сама простота. Здесь мы имеем дело с методом того же рода, что и у применявшегося для тестирования класса ElfListBox. Но на сей раз он предназначен для тестирования ElfscrollListBox:

Void jButtonl_actionPerformed(ActionEvent е)

{

For (int i = O; i < 100; i++)

{

ElfScrollListBoxl. addString ("ListBox Mania,’ + i) ;

}

}

Обозначение кода как не рекомендованного

Прежде чем завершить эту главу, я еще должен рассказать о том, как правильно отмечать метод как не рекомендованный (deprecated). Это то, что вам придется де­лать, если вы возьметесь за создание компонентов.

Когда я впервые создал класс ElfListBox, для добавления строк в окно списка я пользовался методом setstring. Поскольку на самом деле этот метод занимался добавлением строк в окно списка, это имя ему не совсем подходило. К сожалению, уже было написано много кода, в котором были ссылки на метод setstring. Вместо

Того чтобы менять этот код, я просто пометил, что этот метод является не рекомен­дованным. Для этого я просто поместил в комментарий перед методом конструк­цию Sdeprecated:

/**

* Sdeprecated Вместо этого метода использовать addString

*

* Sparam value Добавление этой строки в окно списка.

*/

Public void setstring(String value)

{

AddString(value);

)

После того, как это было сделано, каждый раз, когда я использовал setstring вместо addstring, возникало предупреждение о том, что метод является не реко­мендованным. Это как раз то, что и было мне нужно, поскольку я получал напоми­нания изменить код, но это вовсе не обязывало меня вносить какие-либо измене­ния в него.

Каталоги Ext

примечаниеПри создании JAR-файла вы обычно не сможете его использовать, пока не поме­стите его в свой путь классов или в библиотеку JBuilder. Простой способ это обойти состоит в том, чтобы поместить JAR-файл в каталог Jre∕lib∕eχt Своего комплекта JDK. По умолчанию упомянутый каталог должен существовать. Если каталога нет, вы можете его создать, и JDK будет знать, Что следует искать в нем. Вам, возможно, придется перезапустить JBuilder, прежде чем он поймет, что вы поместили библио­теку в каталог Ext.

В Windows один из относительно надежных способов убедиться в том, что JBuiIder нашел ваш JAR-файл в каталоге ext, заключается в том, чтобы попытаться его уда­лить. Если Windows остановит ваши действия сообщением "The process cannot access the file because it is being used by another process" ("Доступ к файлу не возможен, так как он используется другим процессом"), можно предположить, что JBuiIder его заметил. Конечно Же, прежде чем проводить этот маленький тест, вам следует сделать копию файла.

Будущее визуальной разработки

По ряду причин у некоторых людей возникает мысль, что есть что-то неправиль­ное в том, что вместо того, чтобы намертво прилипнуть к Swing API, используются альтернативные элементы управления, выпущенные независимыми разработчика­ми. Это неправда. Вся идея Java-архитектуры и таких инструментов, как JBuilder, заключается в том, что они позволяют вам создавать и легко использовать большое множество компонентов.

Кроме того, что я нахожу это полезным, одна из причин, почему я настолько ин­тенсивно использую класс ElfListBox в программах-примерах этой книги, состоит в том, что я хочу приучить вас к идее использования компонентов, выпущенных не — зазисимнми разработчиками. Я отношусь к Swing как к стартовой точке, на основе которой можно создавать по-настоящему серьезные визуальные Java-компоненты.

Главы, рассматривающие JavaBeans, а также часть V, "Управление проектами", на­писаны таким образом, чтобы как можно ближе познакомить вас с Java-пакетами, JAR-файлами, путями классов и компонентами. Я хочу, чтобы вы, пользуясь компо­нентами, не являющимися частью JDK, чувствовали себя вполне комфортно.

Если вы приобрели копию JBuilder непосредственно у компании Borland, у вас, должно быть, имеется компакт-диск с дополнительными инструментами Companion Tools CD. Этот компакт-диск содержит целый набор прекрасно реали­зованных элементов управления от независимых разработчиков. Не стоит прояв­лять недальновидность и не исследовать эти элементы на предмет того, в каких мо­ментах они могут оказать помощь.

Разработчики Java сделали огромный вклад в то, чтобы предоставить в ваше рас­поряжение инструмент, с помощью которого можно легко создавать и использовать компоненты. JavaBean-компоненты во многом представляют собой то, в чем как раз и заключается сама идея Java.

Новые мощные процессоры, видеокарты, быстрая память больших объемов, ко­торые можно найти даже в недорогих моделях современных компьютеров, в конце концов, привели к широкому распространению Java-приложений с графическим интерфейсом. Я все еще замечаю разницу в производительности между таким инст­рументом, как JBuilder, который написан на Java, и родными мне инструментами, такими как Delphi или Visual C++, которые реализованы на Object Pascal и C++. Но чем дальше, тем все больше эта разница становится чисто академической.

Java-сообщество нуждается в том, чтобы полностью охватить визуальные инстру­менты и основанные на компонентах архитектуры, и начать распространять мощ­ные приложения, основанные на разнообразных инструментах, произведенных не­зависимыми компаниями. Советую вам потратить некоторое время на изучение бесплатных или относительно дешевых инструментов, доступных в Internet. Резуль­таты могут вас приятно удивить.

Резюме

Теперь, когда у вас имеется представление о том, что можно сделать с помощью JavaBean-компонентов, вы, должно быть, начали понимать, насколько гибкими яв­ляются инструменты в языке Java. Программирование с использованием техноло­гии JavaBeans как раз и связано с созданием таких компонентов, как EifListBox И ElfscrollListBox. Не стоит тратить время, мучаясь с компонентами JList, JScrollPane И DefaultListModel, Когда можно настолько быстро и просто напи­сать EifscroiiListBox, А затем постоянно его использовать в своих собственных программах.

Не останавливайтесь на достигнутом. Те элементы управления, которые я здесь привожу, являются преимущественно обучающими. Вы можете легко расширить их и придать им более широкие функциональные возможности. Вы можете найти идеи по поводу расширения своих версий элементов управления путем исследования ви­зуальных Java-инструментов, которые можно найти в Internet или на компакт-диске JBuilder Companion CD.

Чарли Калверт

Глава 35

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *