blob: eddefda0399212d5b9b5a5fddd7d8e19008081de [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Руководство по началу работы с платформой NetBeans 6.8</title>
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="AUDIENCE" content="NBUSER"/>
<meta name="TYPE" content="ARTICLE"/>
<meta name="EXPIRES" content="N"/>
<meta name="developer" content="gwielenga@netbeans.org"/>
<meta name="indexed" content="y"/>
<meta name="description"
content="A short guide to getting started with the NetBeans Platform."/>
<!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<!-- Use is subject to license terms.-->
</head>
<body>
<h1>Руководство по началу работы с платформой NetBeans</h1>
<p>Добро пожаловать в <a href="https://platform.netbeans.org/"><b>платформу NetBeans</b></a>!</p>
<p>Основным преимуществом платформы NetBeans является модульная архитектура. Кроме того, имеется воможность использования в платформе NetBeans инструментария пользовательского интерфейса Swing, являющегося официальным инструментарием создания пользовательских интерфейсов в Java, в сочетании с отмеченным наградой средством разработки Matisse GUI Builder среды IDE NetBeans.</p>
<p>В данном руководстве вы познакомитесь с преимуществами использования модульности на очень простом примере, созданном Томасом Вюртингером (Thomas W&uuml;rthinger), докторантом университета имени Иоганнеса Кеплера в г. Линц, Австрия. После изучения основных понятий вы сможете перейти к <a href="https://netbeans.org/kb/trails/platform_ru.html">Учебной карте по платформе NetBeans</a>, которая предлагает богатый выбор учебных курсов по различным сценариям, относящимся к платформе NetBeans.</p>
<p class="tips"> Если вы ранее не работали с платформой NetBeans, настоятельно рекомендуем посмотреть серию демонстрационных роликов <a href="https://platform.netbeans.org/tutorials/nbm-10-top-apis.html">10 лучших интерфейсов API NetBeans</a>.</p>
<p><b>Содержание</b></p>
<p><img src="../../images/articles/69/netbeans-stamp7-8-9.png" class="stamp" width="114" height="114" alt="Содержимое на этой странице относится к среде IDE NetBeans 6.5, 6.7, 6.8" title="Содержимое на этой странице относится к среде IDE NetBeans 6.5, 6.7, 6.8" /></p>
<ul class="toc">
<li><a href="#single">Одномодульное приложение платформы NetBeans</a></li>
<li><a href="#lookup">Модульное приложение с использованием класса Lookup</a></li>
<li><a href="#listener">LookupListener и InstanceContent</a></li>
</ul>
<p><b>Для работы с этим учебным курсом требуются программное обеспечение и ресурсы, перечисленные в таблице ниже.</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Программное обеспечение или ресурс</th>
<th class="tblheader" scope="col">Требуемая версия</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">Среда IDE NetBeans</a></td>
<td class="tbltd1">версия 6.7 или выше </td>
</tr>
<tr>
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Комплект для разработчика на языке Java (JDK)</a></td>
<td class="tbltd1">версия 6 или<br/>версия 5</td>
</tr>
</tbody>
</table>
<p><b class="notes">Примечание.</b> Хотя платформа NetBeans является самостоятельным продуктом, ее не требуется загружать отдельно. Обычно разработка приложения выполняется в среде IDE NetBeans, после чего из приложения исключаются модули, специфичные для среды IDE, но излишние в данном приложении.</p>
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="single"></a>Одномодульное приложение платформы NetBeans</h2>
<p>Начнем с создания простого приложения на платформе NetBeans, содержащего один модуль.</p>
<ol>
<li>Выберите в меню &quot;Файл&quot; команду &quot;Новый проект&quot; и щелкните проект &quot;Модули NetBeans&quot;. Выберите параметр &quot;Приложение платформы NetBeans&quot;. На экране появится следующее окно:
<p><img src="../../images/tutorials/quickstart-platform/wordapp01.png" alt="Рис. 1" /></p>
<p>Нажмите кнопку &quot;Далее&quot;.</p></li>
<li>Вызовите новое приложение &quot;WordApp&quot; и установите его как основной проект среды IDE:
<p><img src="../../images/tutorials/quickstart-platform/wordapp02.png" alt="Рис. 2" /></p>
<p class="tips"> Основной проект среды IDE запускается при вызове команды глобального проекта &quot;Выполнить проект&quot;.</p>
<p>Нажмите кнопку &quot;Готово&quot;.</p></li>
<li>Разверните новое приложение в окне &quot;Проекты&quot;, щелкните узел &quot;Модули&quot; правой кнопкой и выберите команду &quot;Добавить новый&quot;. Вызовите новый модуль &quot;WordEngine&quot;:
<p><img alt="Создание нового модуля" src="../../images/tutorials/quickstart-platform/wordapp03.png" /></p>
<p>Нажмите кнопку &quot;Далее&quot;.</p></li>
<li>Введите уникальное имя модуля, которое является базовым кодовым именем, и имя, которое будет отображаться в окне &quot;Проекты&quot;:
<p><img alt="Ввод имени" src="../../images/tutorials/quickstart-platform/wordapp04.png" /></p>
<p>Нажмите кнопку &quot;Готово&quot;. Новый модуль создан. Структура модуля выводится в окне &quot;Проекты&quot;.</p></li>
<li>Щелкните модуль &quot;WordEngine&quot; правой кнопкой и выберите в меню &quot;Создать&quot; команду &quot;Прочее&quot;. В категории &quot;Разработка модулей&quot; выберите &quot;Оконный компонент&quot;:
<p><img alt="Создание окна" src="../../images/tutorials/quickstart-platform/wordapp05.png" /></p>
<p>Нажмите кнопку &quot;Далее&quot;. На экране появится следующее окно:</p>
<p><img alt="Создание окна" src="../../images/tutorials/quickstart-platform/wordapp06.png" /></p>
<p>Нажмите кнопку &quot;Далее&quot;.</p></li>
<li>Введите в качестве префикса имени класса слово &quot;Text&quot; и выберите &quot;org.demo.wordengine&quot; в списке пакетов:
<p><img alt="Установка определений" src="../../images/tutorials/quickstart-platform/wordapp07.png" /></p>
<p>Нажмите кнопку &quot;Готово&quot;. К исходной структуре модуля будет добавлено новое окно с несколькими вспомогательными файлами XML.</p></li>
<li>Теперь дважды щелкните файл &quot;TextTopComponent.java&quot; для открытия его в представлении &quot;Проектирование&quot; в Конструкторе GUI Matisse. Для перетаскивания кнопок и текстовых областей в окно используйте палитру (CTRL+SHIFT+8):
<p><img alt="Палитра" src="../../images/tutorials/quickstart-platform/wordapp15.png" /></p>
<p>Щелкните текстовую область правой кнопки мыши, выберите параметр &quot;Изменить имя переменной&quot; и задайте имя переменной &quot;text&quot;. Данное имя позволяет выполнять доступ к компоненту из кода. Введите в качестве названия кнопки текст &quot;Filter!&quot;</p></li>
<li>Дважды щелкните кнопку, что вызовет автоматическое создание метода обработки события в редакторе исходного кода. Метод вызывается всякий раз при нажатии кнопки. Замените тело метода следующим кодом.
<pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
s = s.toUpperCase();
text.setText(s);
}</pre></li>
<li>Щелкните приложение правой кнопкой мыши и выберите команду &quot;Выполнить&quot;. Новое приложение на платформе NetBeans будет запущено, а модуль установлен. Ваше новое приложение должно выглядеть следующим образом:
<p><img alt="Отображение нового приложения" src="../../images/tutorials/quickstart-platform/wordapp08.png" /></p></li>
<li>Выберите в меню &quot;Окно&quot; команду &quot;Text&quot;, введите текст в текстовую область и нажмите &quot;Filter!&quot;. Текст будет выведен на экран в верхнем регистре:
<p><img alt="Верхний регистр" src="../../images/tutorials/quickstart-platform/wordapp09.png" /></p></li>
</ol>
<p>Вы узнали, как создавать новое приложение на платформе NetBeans и как добавлять в него новые модули.</p>
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="lookup"></a>Модульное приложение с использованием класса Lookup</h2>
<p>Мы создадим два дополнительных модуля. Первый модуль определяет службу, которую второй обеспечивает для модуля, определенного в предыдущем разделе.</p>
<ol>
<li>Разверните новое приложение в окне &quot;Проекты&quot;, щелкните узел &quot;Модули&quot; правой кнопкой и выберите команду &quot;Добавить новый&quot;. Дайте новому модулю имя &quot;TextFilter&quot; и базовое кодовое имя &quot;org.demo.textfilter&quot;, выполните действия, предлагаемые мастером, для добавления модуля в ранее созданное приложение, как это было сделано в предыдущем разделе.</li>
<li>Щелкните правой кнопкой мыши модуль TextFilter и выберите &quot;Создать&quot; &gt; &quot;Интерфейс Java&quot;. В пакете &quot;org.demo.textfilter&quot; укажите имя интерфейса Java &ndash; &quot;TextFilter&quot; &ndash; и используйте редактор для его определения следующим образом:
<pre class="examplecode">package org.demo.textfilter;
public interface TextFilter {
String process(String s);
}
</pre></li>
<li>Щелкните модуль &quot;TextFilter&quot; правой кнопкой, выберите команду &quot;Свойства&quot; и используйте вкладку &quot;Версии API&quot;, чтобы указать, что пакет, в который входит интерфейс, доступен во всем приложении:
<p><img src="../../images/tutorials/quickstart-platform/wordapp10.png"/></p></li>
<li>Создайте третий модуль в приложении, назовите его &quot;MyFilter&quot; с &quot;org.demo.myfilter&quot; в качестве базового кодового имени.</li>
<li>Добавьте зависимость к модулю &quot;TextFilter&quot; в диалоговом окне &quot;Свойства проекта&quot; только что созданного модуля &quot;MyFilter&quot;:
<p><img src="../../images/tutorials/quickstart-platform/wordapp11.png"/></p></li>
<li>Теперь на основании определенной выше зависимости можно реализовать интерфейс, определенный во втором модуле:
<pre class="examplecode">package org.demo.myfilter;
import org.demo.textfilter.TextFilter;
@ServiceProvider(service=TextFilter.class)
public class UpperCaseFilter implements TextFilter {
public String process(String s) {
return s.toUpperCase();
}
}</pre>
<p class="tips"> Во время компиляции аннотация @ServiceProvider создает папку META-INF/services с файлом, в котором регистрируется реализация интерфейса TextFilter в соответствии с механизмомJDK 6 ServiceLoader. Необходимо установить зависимость от модуля API средств, который поставляет аннотацию ServiceProvider.</p></li>
<li>Теперь необходимо изменить код, обрабатывающий нажатие кнопки фильтрации, чтобы найти и загрузить средство реализации интерфейса &quot;TextFilter&quot;. Когда такое средство реализации найдено, оно вызывается для фильтрации текста.
<p>Прежде чем это выполнить, необходимо добавить зависимость к модулю &quot;TextFilter&quot; в диалоговом окне &quot;Свойства проекта&quot; модуля &quot;WordEngine&quot;:</p>
<p><img src="../../images/tutorials/quickstart-platform/wordapp12.png"/></p>
<p>После этого можно загрузить реализации класса &quot;TextFilter&quot;, как показано ниже:</p>
<pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
<b>TextFilter filter = Lookup.getDefault().lookup(TextFilter.class)</b>;
if (filter != null) {
s = filter.process(s);
}
text.setText(s);
}</pre>
<p class="tips"> Вышестоящий метод можно было бы выполнить с помощью класса &quot;ServiceLoader&quot; пакета JDK 6, однако класс &quot;Lookup&quot; может использоваться в пакете JDK более ранней версии, чем JDK 6. Кроме того, класс &quot;Lookup&quot; имеет дополнительные функции, как показано в следующем разделе.</p>
</li>
</ol>
<p>Теперь вы готовы к запуску кода и проверке того, что все работает как прежде. Несмотря на то, что функциональные возможности остались прежними, новая модульная конструкция предлагает четкое разделение между графическим пользовательским интерфейсом и реализацией фильтрации. Новое приложение можно легко расширять, просто добавляя новых поставщиков услуг в путь к классам приложения.</p>
<p>В качестве упражнения попробуйте внести в код изменения, последовательно применяющие ВСЕ найденные текстовые фильтры к тексту (используя метод &quot;lookupAll&quot;). Например, добавьте реализацию текстового фильтра, удаляющего все пробелы, а затем протестируйте полученное приложение.</p>
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="listener"></a>LookupListener и InstanceContent</h2>
<p>Попробуем создать четвертый модуль, который динамически принимает тексты при нажатии кнопки &quot;Filter!&quot; в первом модуле.</p>
<ol>
<li>В первом модуле измените конструктор &quot;TextTopComponent&quot; следующим образом:
<pre class="examplecode"><b>private InstanceContent content;</b>
private TextTopComponent() {
initComponents();
setName(NbBundle.getMessage(TextTopComponent.class, &quot;CTL_TextTopComponent&quot;));
setToolTipText(NbBundle.getMessage(TextTopComponent.class, &quot;HINT_TextTopComponent&quot;));
// setIcon(Utilities.loadImage(ICON_PATH, true));
<b>content = new InstanceContent();
associateLookup(new AbstractLookup(content));</b>
}</pre></li>
<li>Измените код кнопки фильтрации, чтобы при нажатии кнопки к объекту <tt>InstanceContent</tt> добавлялось старое значение.
<pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
TextFilter filter = Lookup.getDefault().lookup(TextFilter.class);
if (filter != null) {
<b>content.add(s);</b>
s = filter.process(s);
}
text.setText(s);
}</pre></li>
<li>Создайте новый модуль и присвойте ему имя &quot;History&quot; с базовым кодовым именем &quot;com.demo.history&quot;.</li>
<li>В модуле &quot;History&quot; создайте новый компонент окна с префиксом &quot;History&quot; в пакете &quot;com.demo.history&quot;. Укажите, что этот компонент должен отображаться в позиции &quot;editor&quot;. После создания окна добавьте к нему текстовую область. Измените имя переменной текстовой области на &quot;historyText&quot;.</li>
<li>Добавьте к конструктору класса &quot;HistoryTopComponent&quot; код для отслеживания поиска класса <tt>String</tt> текущего активного окна. На экран будут выведены все полученные объекты <tt>String</tt> в текстовой области:
<pre class="examplecode"><b>private Lookup.Result result;</b>
private HistoryTopComponent() {
...
<b>result = org.openide.util.Utilities.actionsGlobalContext().lookupResult(String.class);
result.addLookupListener(new LookupListener() {
public void resultChanged(LookupEvent e) {
historyText.setText(result.allInstances().toString());
}
});</b>
}</pre></li>
<li>После этого приложение можно запустить и поэкспериментировать над ним. В результате на экран должно быть выведено окно, похожее на один из следующих вариантов:
<p><img src="../../images/tutorials/quickstart-platform/wordapp13.png"/></p>
<p>В качестве упражнения попробуйте изменить тип результата поиска со значения <tt>String</tt> на <tt>Object</tt> и посмотрите, что произойдет, если выбрать другие окна.</p></li>
</ol>
<p>Поздравляем! На этом этапе с помощью незначительного программирования был создан небольшой пример модульного приложения:</p>
<p><img src="../../images/tutorials/quickstart-platform/wordapp14.png"/></p>
<p>Приложение состоит из четырех модулей. Код из одного модуля может использоваться в другом модуле, только если (1) первый модуль явно раскрыл пакеты, и (2) второй модуль установил зависимость от первого модуля. Таким образом платформа NetBeans помогает организовать код в строгой модульной архитектуре, обеспечивая невозможность случайного повторного использования кода, за исключением случая установления контрактов между модулями, обеспечивающими код.</p>
<p>Кроме того, класс <tt>Lookup</tt> вводится как механизм коммуникации между модулями, как расширение метода ServiceLoader пакета JDK 6. Реализации загружаются через свои интерфейсы. Не используя код из реализации, модуль &quot;WordEngine&quot; может вывести на экран службу, предоставленную средством реализации. Таким способом обеспечивается свободное соединение между приложениями платформы NetBeans.</p>
<p class="tips"> Для дальнейшего изучения модульности и платформы NetBeans перейдите к руководству &quot;Управлением выбором в платформе NetBeans&quot;, состоящему из 4 частей, которое <a href="https://platform.netbeans.org/tutorials/nbm-selection-1.html">начинается здесь</a>. Затем можно воспользоваться <a href="https://netbeans.org/kb/trails/platform_ru.html">Учебной картой по платформе NetBeans</a> и выбрать учебные курсы, максимально подходящие для вашего индивидуального бизнес-сценария. Кроме того, при возникновении вопросов по платформе NetBeans можно обратиться по адресу: dev@openide.netbeans.org. Архив вопросов находится <a href="https://netbeans.org/projects/platform/lists/dev/archive">здесь</a>.</p>
<p>Приятной работы с платформой NetBeans! Не забудьте подписаться на наши рассылки!</p>
</body>
</html>