| <!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ü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>Выберите в меню "Файл" команду "Новый проект" и щелкните проект "Модули NetBeans". Выберите параметр "Приложение платформы NetBeans". На экране появится следующее окно: |
| <p><img src="../images/tutorials/quickstart-platform/wordapp01.png" alt="Рис. 1" /></p> |
| <p>Нажмите кнопку "Далее".</p></li> |
| |
| <li>Вызовите новое приложение "WordApp" и установите его как основной проект среды IDE: |
| <p><img src="../images/tutorials/quickstart-platform/wordapp02.png" alt="Рис. 2" /></p> |
| <p class="tips"> Основной проект среды IDE запускается при вызове команды глобального проекта "Выполнить проект".</p> |
| <p>Нажмите кнопку "Готово".</p></li> |
| |
| <li>Разверните новое приложение в окне "Проекты", щелкните узел "Модули" правой кнопкой и выберите команду "Добавить новый". Вызовите новый модуль "WordEngine": |
| <p><img alt="Создание нового модуля" src="../images/tutorials/quickstart-platform/wordapp03.png" /></p> |
| <p>Нажмите кнопку "Далее".</p></li> |
| |
| <li>Введите уникальное имя модуля, которое является базовым кодовым именем, и имя, которое будет отображаться в окне "Проекты": |
| <p><img alt="Ввод имени" src="../images/tutorials/quickstart-platform/wordapp04.png" /></p> |
| <p>Нажмите кнопку "Готово". Новый модуль создан. Структура модуля выводится в окне "Проекты".</p></li> |
| |
| <li>Щелкните модуль "WordEngine" правой кнопкой и выберите в меню "Создать" команду "Прочее". В категории "Разработка модулей" выберите "Оконный компонент": |
| <p><img alt="Создание окна" src="../images/tutorials/quickstart-platform/wordapp05.png" /></p> |
| |
| <p>Нажмите кнопку "Далее". На экране появится следующее окно:</p> |
| <p><img alt="Создание окна" src="../images/tutorials/quickstart-platform/wordapp06.png" /></p> |
| <p>Нажмите кнопку "Далее".</p></li> |
| |
| <li>Введите в качестве префикса имени класса слово "Text" и выберите "org.demo.wordengine" в списке пакетов: |
| <p><img alt="Установка определений" src="../images/tutorials/quickstart-platform/wordapp07.png" /></p> |
| <p>Нажмите кнопку "Готово". К исходной структуре модуля будет добавлено новое окно с несколькими вспомогательными файлами XML.</p></li> |
| |
| <li>Теперь дважды щелкните файл "TextTopComponent.java" для открытия его в представлении "Проектирование" в Конструкторе GUI Matisse. Для перетаскивания кнопок и текстовых областей в окно используйте палитру (CTRL+SHIFT+8): |
| |
| <p><img alt="Палитра" src="../images/tutorials/quickstart-platform/wordapp15.png" /></p> |
| |
| <p>Щелкните текстовую область правой кнопки мыши, выберите параметр "Изменить имя переменной" и задайте имя переменной "text". Данное имя позволяет выполнять доступ к компоненту из кода. Введите в качестве названия кнопки текст "Filter!"</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>Щелкните приложение правой кнопкой мыши и выберите команду "Выполнить". Новое приложение на платформе NetBeans будет запущено, а модуль установлен. Ваше новое приложение должно выглядеть следующим образом: |
| <p><img alt="Отображение нового приложения" src="../images/tutorials/quickstart-platform/wordapp08.png" /></p></li> |
| |
| <li>Выберите в меню "Окно" команду "Text", введите текст в текстовую область и нажмите "Filter!". Текст будет выведен на экран в верхнем регистре: |
| <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>Разверните новое приложение в окне "Проекты", щелкните узел "Модули" правой кнопкой и выберите команду "Добавить новый". Дайте новому модулю имя "TextFilter" и базовое кодовое имя "org.demo.textfilter", выполните действия, предлагаемые мастером, для добавления модуля в ранее созданное приложение, как это было сделано в предыдущем разделе.</li> |
| |
| <li>Щелкните правой кнопкой мыши модуль TextFilter и выберите "Создать" > "Интерфейс Java". В пакете "org.demo.textfilter" укажите имя интерфейса Java – "TextFilter" – и используйте редактор для его определения следующим образом: |
| |
| <pre class="examplecode">package org.demo.textfilter;
|
|
|
| public interface TextFilter {
|
|
|
| String process(String s);
|
|
|
| } |
| </pre></li> |
| |
| <li>Щелкните модуль "TextFilter" правой кнопкой, выберите команду "Свойства" и используйте вкладку "Версии API", чтобы указать, что пакет, в который входит интерфейс, доступен во всем приложении: |
| |
| <p><img src="../images/tutorials/quickstart-platform/wordapp10.png"/></p></li> |
| |
| <li>Создайте третий модуль в приложении, назовите его "MyFilter" с "org.demo.myfilter" в качестве базового кодового имени.</li> |
| |
| <li>Добавьте зависимость к модулю "TextFilter" в диалоговом окне "Свойства проекта" только что созданного модуля "MyFilter": |
| |
| <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>Теперь необходимо изменить код, обрабатывающий нажатие кнопки фильтрации, чтобы найти и загрузить средство реализации интерфейса "TextFilter". Когда такое средство реализации найдено, оно вызывается для фильтрации текста. |
| <p>Прежде чем это выполнить, необходимо добавить зависимость к модулю "TextFilter" в диалоговом окне "Свойства проекта" модуля "WordEngine":</p> |
| |
| <p><img src="../images/tutorials/quickstart-platform/wordapp12.png"/></p> |
| |
| <p>После этого можно загрузить реализации класса "TextFilter", как показано ниже:</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"> Вышестоящий метод можно было бы выполнить с помощью класса "ServiceLoader" пакета JDK 6, однако класс "Lookup" может использоваться в пакете JDK более ранней версии, чем JDK 6. Кроме того, класс "Lookup" имеет дополнительные функции, как показано в следующем разделе.</p> |
| </li> |
| </ol> |
| |
| <p>Теперь вы готовы к запуску кода и проверке того, что все работает как прежде. Несмотря на то, что функциональные возможности остались прежними, новая модульная конструкция предлагает четкое разделение между графическим пользовательским интерфейсом и реализацией фильтрации. Новое приложение можно легко расширять, просто добавляя новых поставщиков услуг в путь к классам приложения.</p> |
| |
| <p>В качестве упражнения попробуйте внести в код изменения, последовательно применяющие ВСЕ найденные текстовые фильтры к тексту (используя метод "lookupAll"). Например, добавьте реализацию текстового фильтра, удаляющего все пробелы, а затем протестируйте полученное приложение.</p> |
| |
| <!-- ===================================================================================== --> |
| |
| <h2 class="tutorial"><a name="listener"></a>LookupListener и InstanceContent</h2> |
| |
| <p>Попробуем создать четвертый модуль, который динамически принимает тексты при нажатии кнопки "Filter!" в первом модуле.</p> |
| |
| <ol> |
| <li>В первом модуле измените конструктор "TextTopComponent" следующим образом: |
| |
| <pre class="examplecode"><b>private InstanceContent content;</b> |
| |
| private TextTopComponent() { |
| initComponents(); |
| setName(NbBundle.getMessage(TextTopComponent.class, "CTL_TextTopComponent")); |
| setToolTipText(NbBundle.getMessage(TextTopComponent.class, "HINT_TextTopComponent")); |
| // 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>Создайте новый модуль и присвойте ему имя "History" с базовым кодовым именем "com.demo.history".</li> |
| <li>В модуле "History" создайте новый компонент окна с префиксом "History" в пакете "com.demo.history". Укажите, что этот компонент должен отображаться в позиции "editor". После создания окна добавьте к нему текстовую область. Измените имя переменной текстовой области на "historyText".</li> |
| |
| <li>Добавьте к конструктору класса "HistoryTopComponent" код для отслеживания поиска класса <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. Реализации загружаются через свои интерфейсы. Не используя код из реализации, модуль "WordEngine" может вывести на экран службу, предоставленную средством реализации. Таким способом обеспечивается свободное соединение между приложениями платформы NetBeans.</p> |
| |
| <p class="tips"> Для дальнейшего изучения модульности и платформы NetBeans перейдите к руководству "Управлением выбором в платформе NetBeans", состоящему из 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> |