| <!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."> |
| </head> |
| <body> |
| |
| <h1>Руководство по началу работы с платформой NetBeans</h1> |
| |
| <p>Добро пожаловать в <a href="https://platform.netbeans.org/"><b>платформу NetBeans</b></a>! |
| |
| <p>Основным преимуществом платформы NetBeans является модульная архитектура. Кроме того, имеется воможность использования в платформе NetBeans инструментария пользовательского интерфейса Swing, являющегося официальным инструментарием создания пользовательских интерфейсов в Java, в сочетании с отмеченным наградой средством разработки Matisse GUI Builder среды IDE NetBeans. |
| |
| <p>В данном руководстве вы познакомитесь с преимуществами использования модульности на очень простом примере, созданном Томасом Вюртингером (Thomas Würthinger), докторантом университета имени Иоганнеса Кеплера в г. Линц, Австрия. После изучения основных понятий вы сможете перейти к <a href="https://netbeans.org/kb/trails/platform_ru.html">Учебной карте по платформе NetBeans</a>, которая предлагает богатый выбор учебных курсов по различным сценариям, относящимся к платформе NetBeans. |
| |
| <p class="tips"> Если вы ранее не работали с платформой NetBeans, настоятельно рекомендуем посмотреть серию демонстрационных роликов <a href="https://platform.netbeans.org/tutorials/nbm-10-top-apis.html">10 лучших интерфейсов API NetBeans</a>. |
| |
| <p><b>Содержание</b></p> |
| <img src="../images/articles/68/netbeans-stamp-65-67-68.gif" 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><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.5 или выше </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, но излишние в данном приложении. |
| |
| <!-- ===================================================================================== --> |
| |
| <h2 class="tutorial"><a name="single"></a>Одномодульное приложение платформы NetBeans</h2> |
| |
| <p>Начнем с создания простого приложения на платформе NetBeans, содержащего один модуль. |
| |
| <ol> |
| |
| <p><li>Выберите команду "File" | "New Project" и щелкните "NetBeans Modules". Выберите "NetBeans Platform Application". На экране появится следующее окно:</p> |
| <p><p align="left"><img border="1" src="../images/tutorials/quickstart-platform/wordapp01.png" alt="Рис. 1"> |
| <p>Нажмите кнопку "Next".</p> |
| |
| <p><li>Вызовите новое приложение "WordApp" и установите его как основной проект среды IDE:</p> |
| <p><p align="left"><img border="1" src="../images/tutorials/quickstart-platform/wordapp02.png" alt="Рис. 2"> |
| <p class="tips"> Основной проект среды IDE запускается при вызове команды глобального проекта "Run Project".</p> |
| <p>Нажмите кнопку "Finish".</p> |
| |
| <p><li>Разверните новое приложение в окне "Projects", щелкните узел "Modules" правой кнопкой и выберите команду "Add New". Вызовите новый модуль "WordEngine":</p> |
| <p><p align="left"><img border="1" src="../images/tutorials/quickstart-platform/wordapp03.png"/> |
| <p>Нажмите кнопку "Next".</p> |
| |
| <p><li>Введите уникальное имя модуля, которое является базовым кодовым именем, и имя, которое будет отображаться в окне "Projects":</p> |
| <p><p align="left"><img border="1" src="../images/tutorials/quickstart-platform/wordapp04.png"/> |
| <p>Нажмите кнопку "Finish". Новый модуль создан. Структура модуля выводится в окне "Projects". |
| |
| <p><li>Щелкните модуль "WordEngine" правой кнопкой и выберите команду "New" | "Other". В категории "Module Development" выберите "Window Component": |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp05.png"/> |
| |
| <p><p>Нажмите кнопку "Next". На экране появится следующее окно:</p> |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp06.png"/> |
| <p>Нажмите кнопку "Next".</p> |
| |
| <p><li>Введите "Text" в качестве префикса имени класса и выберите "org.demo.wordengine" в списке пакетов:</p> |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp07.png"/> |
| <p>Нажмите кнопку "Finish". К исходной структуре модуля будет добавлено новое окно с несколькими вспомогательными файлами XML.</p> |
| |
| <p><li>Теперь дважды щелкните файл "TextTopComponent.java" для открытия его в представлении "Design" в средстве разработки Matisse GUI Builder. Для перетаскивания кнопок и текстовых областей в окно используйте палитру (Ctrl+Shift+8):</p> |
| |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp15.png"/> |
| |
| <p>Щелкните текстовую область правой кнопки мыши, выберите параметр "Change Variable Name" и задайте имя переменной "text". Данное имя позволяет выполнять доступ к компоненту из кода. Введите в качестве названия кнопки текст "Filter!" |
| |
| <p><li>Дважды щелкните кнопку, что вызовет автоматическое создание метода обработки события в редакторе исходного кода. Метод вызывается всякий раз при нажатии кнопки. Замените тело метода следующим кодом.</p> |
| <p><pre class="examplecode">private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
|
| String s = text.getText();
|
| s = s.toUpperCase();
|
| text.setText(s);
|
| }</pre> |
| |
| <p><li>Щелкните приложение правой кнопкой и выберите команду "Run". Новое приложение на платформе NetBeans будет запущено, а модуль установлен. Ваше новое приложение должно выглядеть следующим образом:</p> |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp08.png"/> |
| |
| <p><li>Выберите команду "Window" | "Text", введите текст в текстовую область и нажмите "Filter!". Текст будет выведен на экран в верхнем регистре:</p> |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp09.png"/> |
| |
| </ol> |
| |
| <p>Вы узнали, как создавать новое приложение на платформе NetBeans и как добавлять в него новые модули. |
| |
| <!-- ===================================================================================== --> |
| |
| <h2 class="tutorial"><a name="lookup"></a>Модульное приложение с использованием класса Lookup</h2> |
| |
| <p>Мы создадим два дополнительных модуля. Первый модуль определяет службу, которую второй обеспечивает для модуля, определенного в предыдущем разделе. |
| |
| <ol> |
| <p><li>Разверните новое приложение в окне "Projects", щелкните узел "Modules" правой кнопкой и выберите команду "Add New". Дайте новому модулю имя "TextFilter" и базовое кодовое имя "org.demo.textfilter", выполните действия, предлагаемые мастером, для добавления модуля в ранее созданное приложение, как это было сделано в предыдущем разделе.</p> |
| |
| <p><li>Щелкните модуль "TextFilter" правой кнопкой и выберите "New" | "Java Interface". В пакете "org.demo.textfilter" укажите имя интерфейса Java – "TextFilter" – и используйте редактор для его определения следующим образом: |
| |
| <p><pre class="examplecode">package org.demo.textfilter;
|
|
|
| public interface TextFilter {
|
|
|
| String process(String s);
|
|
|
| } |
| </pre> |
| |
| <p><li>Щелкните модуль "TextFilter" правой кнопкой, выберите команду "Properties" и используйте вкладку "API Versioning", чтобы указать, что пакет, в который входит интерфейс, доступен во всем приложении:</p> |
| |
| <p><img border="1" src="../images/tutorials/quickstart-platform/fig-10.png"/> |
| |
| <p><li>Создайте третий модуль в приложении, назовите его "MyFilter" с "org.demo.myfilter" в качестве базового кодового имени.</p> |
| |
| <p><li>Добавьте зависимость к модулю "TextFilter" в диалоговом окне "Project Properties" только что созданного модуля "MyFilter":</p> |
| |
| <p><img border="1" src="../images/tutorials/quickstart-platform/fig-11.png"/> |
| |
| <p><li>Теперь на основании определенной выше зависимости можно реализовать интерфейс, определенный во втором модуле: |
| |
| <p><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>Во время компиляции аннотация @ServiceProvider создает папку META-INF/services с файлом, в котором регистрируется реализация интерфейса TextFilter в соответствии с механизмомJDK 6 ServiceLoader. Необходимо установить зависимость от модуля API средств, который поставляет аннотацию ServiceProvider. |
| |
| <p><li>Теперь необходимо изменить код, обрабатывающий нажатие кнопки фильтрации, чтобы найти и загрузить средство реализации интерфейса "TextFilter". Когда такое средство реализации найдено, оно вызывается для фильтрации текста.</p> |
| <p>Прежде чем это выполнить, необходимо добавить зависимость к модулю "TextFilter" в диалоговом окне "Project Properties" модуля "WordEngine":</p> |
| |
| <p><img src="../images/tutorials/quickstart-platform/wordapp12.png"/> |
| |
| <p>После этого можно загрузить реализации класса "TextFilter", как показано ниже:</p> |
| |
| <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> |
| |
| </ol> |
| |
| <p>Теперь вы готовы к запуску кода и проверке того, что все работает как прежде. Несмотря на то, что функциональные возможности остались прежними, новая модульная конструкция предлагает четкое разделение между графическим пользовательским интерфейсом и реализацией фильтрации. Новое приложение можно легко расширять, просто добавляя новых поставщиков услуг в путь к классам приложения.</p> |
| |
| <p>В качестве упражнения попробуйте внести в код изменения, последовательно применяющие ВСЕ найденные текстовые фильтры к тексту (используя метод "lookupAll"). Например, добавьте реализацию текстового фильтра, удаляющего все пробелы, а затем протестируйте полученное приложение.</p> |
| |
| <!-- ===================================================================================== --> |
| |
| <h2 class="tutorial"><a name="listener"></a>LookupListener и InstanceContent</h2> |
| |
| <p>Попробуем создать четвертый модуль, который динамически принимает тексты при нажатии кнопки "Filter!" в первом модуле. |
| |
| <ol> |
| <p><li>В первом модуле измените конструктор "TextTopComponent" следующим образом:</p> |
| |
| <p><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> |
| |
| <p><li>Измените код кнопки фильтрации, чтобы при нажатии кнопки к объекту <tt>InstanceContent</tt> добавлялось старое значение.</p> |
| |
| <p><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> |
| |
| <p><li>Создайте новый модуль и присвойте ему имя "History" с базовым кодовым именем "com.demo.history". |
| <p><li>В модуле "History" создайте новый компонент окна с префиксом "History" в пакете "com.demo.history". Укажите, что этот компонент должен отображаться в позиции "editor". После создания окна добавьте к нему текстовую область. Измените имя переменной текстовой области на "historyText".</p> |
| |
| <p><li>Добавьте к конструктору класса "HistoryTopComponent" код для отслеживания поиска класса <tt>String</tt> текущего активного окна. На экран будут выведены все полученные объекты <tt>String</tt> в текстовой области:</p> |
| |
| <p><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> |
| |
| <p><li>После этого приложение можно запустить и поэкспериментировать над ним. В результате на экран должно быть выведено окно, похожее на один из следующих вариантов:</p> |
| |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp13.png"/> |
| |
| <p>В качестве упражнения попробуйте изменить тип результата поиска со значения <tt>String</tt> на <tt>Object</tt> и посмотрите, что произойдет, если выбрать другие окна.</p> |
| |
| </ol> |
| |
| <p>Поздравляем! На этом этапе с помощью незначительного программирования был создан небольшой пример модульного приложения: |
| |
| <p><img border="1" src="../images/tutorials/quickstart-platform/wordapp14.png"/> |
| |
| <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/openide/lists/dev/archive">здесь</a>.</p> |
| |
| <p>Приятной работы с платформой NetBeans! Не забудьте подписаться на наши рассылки!</p> |
| |
| |
| |
| </body> |
| |
| </html> |