blob: ae7d778ea4a4f28377d29ad080998b41fd1e7f3a [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>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!-- -*- xhtml -*- -->
<title>Руководство по работе с Visual Library на платформе NetBeans 6.0</title>
<link rel="stylesheet" type="text/css" href="../../../netbeans.css">
<meta name="AUDIENCE" content="NBUSER">
<meta name="TYPE" content="ARTICLE">
<meta name="EXPIRES" content="N">
<meta name="developer" content="geertjan.wielenga@sun.com">
<meta name="indexed" content="y">
<meta name="description"
content="A walk-through of the basic features of the Visual Library API.">
<!-- Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved. -->
<!-- Use is subject to license terms.-->
</head>
<body>
<h1>Руководство по работе с Visual Library в среде NetBeans </h1>
<p>Это руководство посвящено работе с основными возможностями, предусмотренными в интерфейсе API для Visual Library в среде NetBeans. Интерфейс API для Visual Library &ndash; это интерфейс визуализации, который удобно использовать в контексте, например, моделирования и построения графов.
</p><p><b>Содержание</b></p>
<img src="../../images/articles/60/netbeans-stamp60-61.gif" class="stamp" width="114" height="114" alt="Содержимое на этой странице относится к среде IDE NetBeans 6.1" title="Содержимое на этой странице относится к среде IDE NetBeans 6.1"> </p>
<ul class="toc">
<li><a href="#getting-started">Настройка модуля</a>
</li><li><a href="#creating-the-scene">Создание рабочего пространства</a>
</li><li><a href="#creating-a-palette">Создание палитры элементов для рабочего пространства</a>
</li><li><a href="#adding-a-layer-widget">Добавление элемента &quot;LayerWidget&quot;</a>
</li><li><a href="#adding-an-icon-widget">Добавление элемента &quot;IconNodeWidget&quot; с функциональностью перетаскивания</a>
</li><li><a href="#adding-to-scene">Добавление функциональности в рабочее пространство</a>
</li><li><a href="#adding-to-widget">Добавление функциональности к элементу &quot;IconNodeWidget&quot;</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">Среда IDE NetBeans</td>
<td class="tbltd1">версия <a href="http://download.netbeans.org/netbeans/6.1/final/">версия 6.1</a> или<br>
версия 6.0</td>
</tr>
<tr>
<td class="tbltd1">Комплект для разработчика на языке Java (JDK)</td>
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">версия 6</a> или<br>
версия 5</td>
</tr>
</tbody>
</table>
<p class="tips">Дополнительно, в целях поиска и устранения ошибок, можно <a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=2701">загрузить готовые примеры</a> и изучить исходный код.
</p><p>В этом руководстве также будут использоваться 3 значка. Здесь можно щелкнуть каждый из них правой кнопкой мыши и сохранить его локально, либо скопировать в местоположение проекта модуля после его создания в соответствии с указаниями, приведенными в данном руководстве. Это следующие значки:
</p><p><img border="1" src="../../images/tutorials/vislib/image1.png"/>
<img border="1" src="../../images/tutorials/vislib/image2.png"/>
<img border="1" src="../../images/tutorials/vislib/image3.png"/>
</p><p>Вся информация, которая потребуется для работы с интерфейсом API для Visual Library, собрана в следующих двух источниках:
</p><ul>
<li><a href="http://graph.netbeans.org/">Страница проекта Visual Library</a>
</li><li><a href="http://graph.netbeans.org/documentation.html">Документация по Visual Library 2.0</a>
</li></ul>
<p>Также см. <a href="http://www.javalobby.org/eps/netbeans_visual_library/">демонстрацию по Visual Library, подготовленную Романом Штроблем (Roman Strobl),</a> на сайте Javalobby.
<!-- ===================================================================================== -->
</p><p></p><h2><a name="getting-started"></a>Настройка модуля</h2>
<p>В этом разделе демонстрируется использование программ-мастеров для создания проекта модуля и собственного оконного элемента.
</p><ol>
<li>Выберите &quot;File &gt; New Project&quot;. В мастере создания проекта выберите &quot;NetBeans Modules&quot; в области &quot;Categories&quot; и &quot;Module&quot; в области &quot;Projects&quot;. Нажмите кнопку &quot;Next&quot;. Введите <tt>ShapeSample</tt> в поле &quot;Project Name&quot; и укажите соответствующую папку на диске в поле &quot;Project Location&quot;. Выберите &quot;Standalone Module&quot; и &quot;Set as Main Project&quot;, если эти параметры не выбраны. Нажмите кнопку &quot;Next&quot;.
<p></p></li><li>Введите <tt>org.netbeans.shapesample</tt> в поле &quot;Code Name Base&quot; и <tt>Shape Sample</tt> в поле &quot;Module Display Name&quot;. Нажмите кнопку &quot;Finish&quot;.
<p></p></li><li>Щелкните проект правой кнопкой мыши, выберите &quot;Properties&quot;, щелкните &quot;Libraries&quot; в диалоговом окне &quot;Project Properties&quot; и установите зависимость от следующих интерфейсов API:
<p></p><ul>
<li>Visual Library API
</li><li>Utilities API
</li></ul>
<p>Нажмите кнопку &quot;OK&quot;.
</p><p></p></li><li>Щелкните проект модуля правой кнопкой мыши, выберите &quot;New &gt; File/Folder&quot;, затем выберите &quot;Window Component&quot; из категории &quot;NetBeans Module Development&quot;. Нажмите кнопку &quot;Next&quot;. Выберите <tt>editor</tt> в раскрывающемся списке и затем выберите &quot;Open on Application Start&quot;. Нажмите кнопку &quot;Next&quot;.
<p></p></li><li>Введите <tt>Shape</tt> в поле &quot;Class Name Prefix&quot;. При необходимости можно добавить значок размером 16x16 пикселей. Нажмите кнопку &quot;Finish&quot;.</p>
<p>Создается несколько файлов, один из которых &ndash; <tt>ShapeTopComponent</tt>. Откройте этот файл в режиме проектирования. Экран должен выглядеть следующим образом:
</p><p><img border="1" src="../../images/tutorials/vislib/shapetopcomponent.png"/>
</p><p></p></li><li>Щелкните правой кнопкой мыши элемент &quot;TopComponent&quot; в режиме проектирования, выберите &quot;Set Layout&quot; и затем выберите &quot;BorderLayout&quot;.
</li></ol>
<p></p><h2><a name="creating-the-scene"></a>Создание рабочего пространства</h2>
<p>Программирование с использованием интерфейса API для Visual Library аналогично программированию в Swing. При этом составляется и изменяется дерево визуальных элементов, именуемых элементами оформления окон (widgets). Корень дерева представлен классом &quot;Scene&quot;, содержащим все визуальные характеристики рабочего пространства. Само рабочее пространство также представляет собой элемент оформления окон. Необходимо создать представление рабочего пространства, которое является элементом &quot;JComponent&quot;. Затем следует добавить &quot;JComponent&quot; к элементу &quot;JScrollPane&quot;.
</p><p>В этом разделе представлена процедура добавления элемента &quot;JScrollPane&quot; к &quot;TopComponent&quot;. Затем создается новое рабочее пространство. Представление рабочего пространства передается в элемент &quot;TopComponent&quot;, что позволяет вывести его в элементе &quot;JScrollPane&quot; элемента &quot;TopComponent&quot;. После этого осуществляется установка проекта модуля и вывод на экран первого рабочего пространства.</p>
<ol>
<li>При помощи окна &quot;Palette&quot; (Ctrl-Shift-8) перетащите <tt>JScrollPane</tt> к элементу &quot;TopComponent&quot;. В окне &quot;Inspector&quot; щелкните правой кнопкой мыши <tt>JScrollPane</tt>, выберите &quot;Change Variable Name&quot; и введите <tt>shapePane</tt>.
<p></p></li><li>В пакете <tt>org.netbeans.shapesample</tt> создайте класс Java с именем <tt>GraphSceneImpl</tt>. Этот класс должен расширять <tt>GraphScene</tt>.</p>
<p>Появляется красное подчеркивание, указывающее на ошибку, и изображение лампочки. Подтвердите создание оператора импорта средой IDE.
</p><p>Снова появляется красное подчеркивание, указывающее на ошибку, и изображение лампочки. Подтвердите создание абстрактных методов класса средой IDE.
</p><p></p></li><li>Создайте фиктивную реализацию класса путем добавления значимых идентификаторов и настройки возврата <tt>null</tt> там, где это необходимо, для удовлетворения всех требований класса:
<pre class="examplecode">public class GraphSceneImpl extends GraphScene {
public GraphSceneImpl() {
}
protected Widget attachNodeWidget(Object node) {
return null;
}
protected Widget attachEdgeWidget(Object edge) {
return null;
}
protected void attachEdgeSourceAnchor(Object edge, Object oldSourceNode, Object newSourceNode) {
}
protected void attachEdgeTargetAnchor(Object edge, Object oldTargetNode, Object newTargetNode) {
}
}</pre>
<p></p></li><li>Теперь вставьте в конструктор элемента &quot;TopComponent&quot; экземпляр класса <tt>GraphSceneImpl</tt>. Для этого добавьте в конец конструктора класса <tt>ShapeTopComponent</tt> следующее:
<pre class="examplecode">GraphSceneImpl scene = new GraphSceneImpl();
myView = scene.createView();
shapePane.setViewportView(myView);
add(scene.createSatelliteView(), BorderLayout.WEST);</pre>
<p>Обратите внимание, что создается два представления. Первое &ndash; это развернутое представление для визуализации графов, моделей и т.д. Второе &ndash; вспомогательное представление с левой стороны элемента &quot;TopComponent&quot;. Наличие двух представлений позволит пользователю быстро перемещаться по основному представлению с одновременным обзором всего рабочего пространства.</p>
<p>Объявите представление &quot;JComponent&quot;:
</p><pre class="examplecode">private JComponent myView;</pre>
<p></p></li><li>Обеспечивать сохранение состояния элемента &quot;TopComponent&quot; при перезапуске среды IDE не требуется. Напротив, в нашем случае это будет ошибкой. Поэтому замените PERSISTENCE_ALWAYS на PERSISTENCE_NEVER, как показано ниже:
<pre class="examplecode">public int getPersistenceType() {
return TopComponent.PERSISTENCE_NEVER;
}</pre>
<p></p></li><li>Щелкните правой кнопкой мыши узел проекта и выберите &quot;Install/Reload in Development IDE&quot;. Если появляется предупреждающее сообщение, нажмите кнопку &quot;OK&quot;.</p>
<p>В процессе установки модуля в списке пунктов меню &quot;Window&quot; появляется новый пункт &quot;Shape&quot;. При выборе этого пункта запускается подготовленная реализация интерфейса API для Visual Library:
</p><p><img border="1" src="../../images/tutorials/vislib/firstscene.png"/>
</p></li>
<!-- ===================================================================================== -->
<p></p><h2><a name="creating-a-palette"></a>Создание палитры элементов для рабочего пространства</h2>
<p>Для практического применения интерфейса API для Visual Library будет реализован <a href="https://netbeans.org/download/dev/javadoc/org-netbeans-spi-palette/overview-summary.html">интерфейс API &quot;Palette&quot;</a>, что позволит создать палитру элементов с фигурами, показанными в начале данного руководства. Затем добавим функциональность перетаскивания, предусмотренную в интерфейсе API для Visual Library, при помощи которой можно будет размещать фигуры в рабочем пространстве путем перетаскивания. После этого расширим рабочее пространство путем добавления дополнительных возможностей, например, масштабирования и перемещения по рабочему пространству.
</p><ol>
<li>Поскольку это руководство посвящено интерфейсу API для Visual Library, а не интерфейсу &quot;Palette&quot;, подробное описание принципов работы последнего здесь не приводится. По этой теме существует достаточно много других руководств (<a href="https://netbeans.org/kb/trails/platform.html">например, здесь</a>). Поэтому просто скопируйте и вставьте в новый пакет с именем <tt>org.netbeans.shapesample.palette</tt> следующие файлы:
<ul>
<li><a href="../../images/tutorials/vislib/Category.java">Category.java</a>
</li><li><a href="../../images/tutorials/vislib/CategoryChildren.java">CategoryChildren.java</a>
</li><li><a href="../../images/tutorials/vislib/CategoryNode.java">CategoryNode.java</a>
</li><li><a href="../../images/tutorials/vislib/PaletteSupport.java">PaletteSupport.java</a>
</li><li><a href="../../images/tutorials/vislib/Shape.java">Shape.java</a>
</li><li><a href="../../images/tutorials/vislib/ShapeChildren.java">ShapeChildren.java</a>
</li><li><a href="../../images/tutorials/vislib/ShapeNode.java">ShapeNode.java</a>
</li></ul>
<p></p></li><li>Добавьте зависимости от интерфейсов API Actions, Nodes и Common Palette аналогично способу, описанному в действии 3 раздела &quot;Начало работы&quot;.</p>
<p></p></li><li>Затем добавьте палитру к элементу &quot;Lookup&quot; элемента &quot;TopComponent&quot; путем вставки следующей строки в конец конструктора &quot;TopComponent&quot;:
<pre class="examplecode">associateLookup( Lookups.fixed( new Object[] { PaletteSupport.createPalette() } ) );</pre>
<p></p></li><li>Среда IDE предложит вставить операторы импорта для <tt>org.openide.util.lookup.Lookups</tt> и <tt>org.netbeans.shapesample.palette.PaletteSupport</tt>. Подтвердите предложение, после чего средой IDE будут автоматически созданы операторы импорта.
<p></p></li><li>Поместите изображения, приведенные в начале этого руководства, в пакет <tt>org.netbeans.shapesample.palette</tt>.</p>
<p>Окно &quot;Projects&quot; теперь должно выглядеть следующим образом:</p>
<p><img border="1" src="../../images/tutorials/vislib/proj-window.png"/>
</p><p></p></li><li>Установите модуль еще раз. При вызове элемента &quot;TopComponent&quot; при помощи соответствующего пункта меню справа от рабочего пространства отображается палитра элементов:</p>
<p><img border="1" src="../../images/tutorials/vislib/firstpalette.png"/>
</p></li>
<!-- ===================================================================================== -->
<p></p><h2><a name="adding-a-layer-widget"></a>Добавление элемента &quot;LayerWidget&quot;</h2>
<p>Элемент <a href="http://graph.netbeans.org/documentation.html#LayerWidget">LayerWidget</a> представляет собой &quot;прозрачный слой&quot; (glasspane), похожий на элемент &quot;JGlassPane&quot; в Swing. Этот элемент прозрачен по умолчанию. Прежде, чем двигаться дальше, добавим элемент &quot;LayerWidget&quot; к рабочему пространству, что позволит в дальнейшем размешать видимые элементы оформления окон путем их перетаскивания в это пространство.
</p><ol><li>Объявите элемент &quot;LayerWidget&quot; в классе <tt>GraphSceneImpl</tt>:
<pre class="examplecode">private LayerWidget mainLayer;</pre>
<p></p></li><li>В конструкторе класса <tt>GraphSceneImpl</tt> добавьте элемент &quot;LayerWidget&quot; как подчиненный элемент рабочего пространства:
<pre class="examplecode">mainLayer = new LayerWidget (this);
addChild (mainLayer);</pre></li></ol>
<p>Теперь при перетаскивании элементов из палитры в рабочее пространство в качестве элементов оформления окон они будут добавляться как подчиненные элементу &quot;LayerWidget&quot;. Поскольку элементы &quot;LayerWidget&quot; по умолчанию являются прозрачными, можно добавить множество таких элементов, один над другим, и таким образом вставить в рабочее пространство, например, фоновое изображение.
</p><p>Для получения более подробной информации см. описание элемента <a href="http://graph.netbeans.org/documentation.html#LayerWidget">LayerWidget</a> в документации Javadoc.
<!-- ===================================================================================== -->
</p><p></p><h2><a name="adding-an-icon-widget"></a>Добавление элемента &quot;IconNodeWidget&quot; с функциональностью перетаскивания</h2>
<p>Ранее конструктор класса <tt>GraphSceneImpl</tt> использовался для передачи рабочего пространства в элемент &quot;JScrollPane&quot; элемента &quot;TopComponent&quot;. Рабочее пространство существует, однако для него еще не настроено поведение. Для настройки поведения нами будут использоваться действия. В этом разделе будет рассмотрено действие <tt><a href="http://graph.netbeans.org/documentation.html#AcceptAction">AcceptAction</a></tt>. Это действие предоставляет функциональность перетаскивания. Функциональность перетаскивания может применяться в отношении элемента оформления окон, однако в нашем случае она будет применена к самому рабочему пространству.
</p><p>Для определения того, что должно происходить при перетаскивании элемента из палитры в пределах рабочего пространства, будет использоваться действие <tt>createAcceptAction</tt>. Здесь задействованы два метода. Первый метод &ndash; <tt>isAcceptable()</tt> &ndash; позволяет определить приемлемость элемента для рабочего пространства. Таким образом можно протестировать перемещаемый элемент. Также можно определить изображение, которое будет появляться при перетаскивании. Это демонстрируется в примере ниже. Если возвращается <tt>true</tt>, вызывается метод <tt>accept</tt>. Получение изображения от перемещаемого элемента производится с использованием того же вспомогательного метода, что и ранее. Затем вызывается метод <tt>addNode</tt>, создающий новый экземпляр <a href="http://graph.netbeans.org/documentation.html#IconNodeWidget">IconNodeWidget</a> и передающий изображение, полученное от перемещаемого элемента.
</p><p>Весь код в этом разделе взаимосвязан, и пока не будут добавлены все названные ниже методы, в коде будут появляться ошибки, обозначенные красным подчеркиванием. Тем не менее, мы попробуем добавить все методы в некоторой логической последовательности.
</p><ol>
<li>Прежде всего, добавьте к конструктору класса <tt>GraphSceneImpl</tt> <tt>createAcceptAction</tt> и два связанных метода:
<pre class="examplecode">getActions().addAction(ActionFactory.createAcceptAction(new AcceptProvider() {
public ConnectorState isAcceptable(Widget widget, Point point, Transferable transferable) {
Image dragImage = getImageFromTransferable(transferable);
JComponent view = getView();
Graphics2D g2 = (Graphics2D) view.getGraphics();
Rectangle visRect = view.getVisibleRect();
view.paintImmediately(visRect.x, visRect.y, visRect.width, visRect.height);
g2.drawImage(dragImage,
AffineTransform.getTranslateInstance(point.getLocation().getX(),
point.getLocation().getY()),
null);
return ConnectorState.ACCEPT;
}
public void accept(Widget widget, Point point, Transferable transferable) {
Image image = getImageFromTransferable(transferable);
Widget w = GraphSceneImpl.this.addNode(new MyNode(image));
w.setPreferredLocation(widget.convertLocalToScene(point));
}
}));</pre>
<p><b>Примечание:</b> После добавления вышеприведенного кода некоторые красные подчеркивания не исчезнут, свидетельствуя о наличии ошибки. Причина появления ошибок состоит в том, что этот код содержит ссылки на метод и класс, которые еще не созданы. Они будут созданы на одном из следующих этапов.
</p><p></p></li><li>Затем в классе <tt>GraphSceneImpl</tt> добавьте вспомогательный метод для получения изображения из перемещаемого элемента:
<pre class="examplecode">private Image getImageFromTransferable(Transferable transferable) {
Object o = null;
try {
o = transferable.getTransferData(DataFlavor.imageFlavor);
} catch (IOException ex) {
ex.printStackTrace();
} catch (UnsupportedFlavorException ex) {
ex.printStackTrace();
}
return o instanceof Image ? (Image) o : Utilities.loadImage(&quot;org/netbeans/shapesample/palette/shape1.png&quot;);
}</pre>
<p>Обратите внимание, что можно указать любое произвольное изображение на случай, если вспомогательный метод не возвращает какое-либо изображение. В примере для этого будет использоваться изображение &quot;<tt>shape1.png</tt>&quot;.</p>
<p></p></li><li>Создайте новый класс с именем <tt>MyNode</tt>. Этот класс представляет узел в графо-ориентированной модели. Он не может быть непосредственно изображением, так как каждый узел в модели должен быть уникальным (это проверяется методом &quot;equals&quot;). Если бы использовались непосредственно изображения, то можно было бы получить только 3 узла в рабочем пространстве (по одному для каждого изображения). При помощи класса &quot;MyNode&quot; можно получить несколько узлов, каждый из которых может иметь свой собственный или совместно используемый экземпляр изображения.
<pre class="examplecode">public class MyNode {
private Image image;
public MyNode(Image image) {
this.image = image;
}
public Image getImage() {
return image;
}
}</pre>
<p></p></li><li>Измените подпись класса <tt>GraphSceneImpl</tt>, как показано ниже, для получения узла классом реализации &quot;Visual Library&quot;:</li>
<pre class="examplecode">extends GraphScene&lt;MyNode, String&gt;</pre>
<p>Подтвердите автоматическое создание средой IDE новых заглушек для абстрактных методов.
</p><p>Кроме того, поскольку в нашем примере используются общие объекты, в среде IDE должен присутствовать инструментарий JDK 1.5. Если точная версия неизвестна, щелкните правой кнопкой мыши проект, выберите &quot;Properties&quot; и перейдите на страницу &quot;Sources&quot;. В раскрывающемся списке &quot;Source Level&quot; выберите &quot;1.5&quot;.
</p><p></p><li>Наконец, определите новый элемент оформления окон в классе <tt>GraphSceneImpl</tt>. Этот метод автоматически вызывается методом <tt>accept</tt>. Он используется для определения элемента оформления окон Visual Library при перетаскивании элемента палитры.
<pre class="examplecode">protected Widget attachNodeWidget(MyNode node) {
IconNodeWidget widget = new IconNodeWidget(this);
widget.setImage(node.getImage());
widget.setLabel(Long.toString(node.hashCode()));
widget.getActions().addAction(ActionFactory.createMoveAction());
mainLayer.addChild(widget);
return widget;
}</pre>
<p>Обратите внимание на установку изображения, получаемого от узла. В качестве идентифицирующей метки будет использоваться генерируемое случайное число. По умолчанию элемент оформления окон существует, но его поведение не определено. Для получения возможности перемещения элемента оформления окон в рабочем пространстве необходимо создать действие по перемещению. Перед возвратом элемента оформления окон в рабочее пространство его следует добавить в качестве подчиненного элементу &quot;LayerWidget&quot;, который был создан в предыдущем разделе.</p>
<p></p></li><li>Перезагрузите модуль и снова откройте окно &quot;Shape&quot;.</p>
<p>Теперь имеется возможность перетаскивания элементов из палитры. При перемещении элемента в рабочем пространстве отображается изображение, которое было определено как изображение при перетаскивании. По завершении перемещения оно заменяется элементом оформления окон, отображаемым в рабочем пространстве, а также во вспомогательном представлении, как показано на следующем рисунке:
</p><p><img border="1" src="../../images/tutorials/vislib/finishedscene.png"/></p>
</li></ol>
<!-- ===================================================================================== -->
<p></p><h2><a name="adding-to-scene"></a>Добавление функциональности в рабочее пространство</h2>
<p>В предыдущем разделе мы добавили к рабочему пространству <tt><a href="http://graph.netbeans.org/documentation.html#AcceptAction">AcceptAction</a></tt>. Необходимо было определить два метода, которые проверяли возможность перетаскивания элемента и способ его обработки. В этом разделе при помощи <tt><a href="http://graph.netbeans.org/documentation.html#ZoomAction">ZoomAction</a></tt> к рабочему пространству будет добавлена функциональность для изменения масштаба.
</p><ol>
<li>Добавьте следующую строку в конструктор класса <tt>GraphSceneImpl</tt>:
<pre class="examplecode">getActions().addAction(ActionFactory.createZoomAction());</pre>
<p></p></li><li>Установите модуль еще раз.
<p></p></li><li>Удерживая нажатой клавишу CTRL, попробуйте изменить масштаб в рабочем пространстве при помощи колеса мыши:</p>
<p><img border="1" src="../../images/tutorials/vislib/zoom.png"/></p>
<p><img border="1" src="../../images/tutorials/vislib/unzoom.png"/></p>
</li></ol>
<p><b>Примечание:</b> Фигуры визуализируются как изображения. SVG в настоящее время не поддерживается.
</p><p>Как и ранее, для добавления возможности перемещения по рабочему пространству вставьте следующую строку:
</p><pre class="examplecode">getActions().addAction(ActionFactory.createPanAction());</pre>
<p>После добавления этой строки пользователь сможет перемещаться по рабочему пространству в любом направлении путем нажатия и поворота колеса мыши.
<!-- ===================================================================================== -->
</p><p></p><h2><a name="adding-to-widget"></a>Добавление функциональности к элементу &quot;IconNodeWidget&quot;</h2>
<p>Ранее для добавления возможности перемещения элемента оформления окон &quot;IconNodeWidget&quot; к нему было добавлено действие <tt><a href="http://graph.netbeans.org/documentation.html#MoveAction">MoveAction</a></tt>. Аналогичным образом для этого элемента оформления окон можно настроить и другие возможности поведения. В этом разделе мы добавим действия <tt><a href="http://graph.netbeans.org/documentation.html#HoverAction">HoverAction</a></tt>, <tt><a href="http://graph.netbeans.org/documentation.html#SelectAction">SelectAction</a></tt> и <tt><a href="http://graph.netbeans.org/documentation.html#InplaceEditorAction">InplaceEditorAction</a></tt>.
</p><p>Действие <tt>InplaceEditorAction</tt> позволит пользователю изменять подпись (метку) элемента:
</p><p><img border="1" src="../../images/tutorials/vislib/editable.png"/></p>
<p>Действие <tt>SelectAction</tt> используется для изменения цвета подписи при выделении элемента оформления окон, а действие <tt>HoverAction</tt> изменяет цвет подписи при наведении на элемент указателя мыши:
</p><p><img border="1" src="../../images/tutorials/vislib/selectable-hoverable.png"/></p>
<ol>
<p></p><li>Сначала определим действие &quot;Editor&quot;, которое будет добавлено к элементу &quot;IconNodeWidget&quot;:
<pre class="examplecode">private WidgetAction editorAction = ActionFactory.createInplaceEditorAction(new LabelTextFieldEditor());</pre>
<p></p></li><li>Затем определим <tt>LabelTextFieldEditor</tt>:
<pre class="examplecode">private class LabelTextFieldEditor implements TextFieldInplaceEditor {
public boolean isEnabled(Widget widget) {
return true;
}
public String getText(Widget widget) {
return ((LabelWidget) widget).getLabel();
}
public void setText(Widget widget, String text) {
((LabelWidget) widget).setLabel(text);
}
}</pre>
<p></p></li><li>Наконец, присвоим действие &quot;Editor&quot; элементу &quot;IconNodeWidget&quot; способом, аналогичным вышеописанной настройке действия &quot;Move&quot;:
<pre class="examplecode">widget.getLabelWidget().getActions().addAction(editorAction);</pre>
<p>Здесь сначала получаем элемент &quot;LabelWidget&quot; элемента оформления окон &quot;IconNodeWidget&quot;. Затем к &quot;LabelWidget&quot; добавляется действие &quot;Editor&quot;.</p>
<p></p></li><li>Среда IDE предложит добавить несколько операторов импорта. В каждом случае следует подтвердить предложенный средой IDE оператор.
<p></p></li><li>Затем, в случаях <tt>SelectAction</tt> и <tt>HoverAction</tt>, потребуется лишь присвоить эти действия элементу &quot;IconNodeWidget&quot;:
<pre class="examplecode">widget.getActions().addAction(createSelectAction());
widget.getActions().addAction(createObjectHoverAction());</pre>
<p></p></li><li>Теперь необходимо определить порядок выполнения созданных действий. Для получения более подробной информации см. раздел <a href="http://graph.netbeans.org/documentation.html#OrderOfActions">Определение порядка действий</a> в документации. После изменения порядка действий код <tt>attachNodeWidget</tt> должен выглядеть следующим образом:
<pre class="examplecode">protected Widget attachNodeWidget(MyNode node) {
IconNodeWidget widget = new IconNodeWidget(this);
widget.setImage(node.getImage());
widget.setLabel(Long.toString(node.hashCode()));
//Двойной щелчок, событие используется только при двойном щелчке:
widget.getLabelWidget().getActions().addAction(editorAction);
//Однократный щелчок, событие не используется:
widget.getActions().addAction(createSelectAction());
//Перетаскивание мышью, событие используется во время перемещения указателя мыши:
widget.getActions().addAction(ActionFactory.createMoveAction());
//Наведение мыши; событие используется при перемещении указателя мыши по элементу оформления окон :
widget.getActions().addAction(createObjectHoverAction());
mainLayer.addChild(widget);
return widget;
}</pre>
<p></p></li><li>Установите и снова протестируйте модуль. Как было показано в начале этого раздела, при наведении указателя мыши на подпись к элементу оформления окон или при выделении этого элемента его цвет изменяется. Кроме того, после щелчка подписи ее текст можно изменить.
</li></ol>
<p>Поздравляем! Руководство по работе с Visual Library 2.0 в среде NetBeans 6.0 завершено.</p>
<br>
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback:%20Visual%20Library%20API%20Tutorial%20NetBeans%206.0">Мы ждем ваших отзывов</a></div>
<br style="clear:both;" />
<a name="next_steps"></a><h2>Что дальше?</h2>
<p>Для получения дополнительной информации о работе с интерфейсом API для &quot;Visual Library&quot; см.:</p>
<ul>
<li><a href="http://www.javalobby.org/eps/netbeans_visual_library/">Демонстрация по Visual Library, подготовленная Романом Штроблем (Roman Strobl),</a> на сайте Javalobby.
</li><li><a href="http://graph.netbeans.org/">Страница проекта Visual Library</a>
</li><li><a href="http://graph.netbeans.org/documentation.html">Документация по Visual Library 2.0</a>
</li></ul>
</ol></ol></body>
</html>