| <!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 – это интерфейс визуализации, который удобно использовать в контексте, например, моделирования и построения графов. |
| |
| </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">Добавление элемента "LayerWidget"</a> |
| </li><li><a href="#adding-an-icon-widget">Добавление элемента "IconNodeWidget" с функциональностью перетаскивания</a> |
| </li><li><a href="#adding-to-scene">Добавление функциональности в рабочее пространство</a> |
| </li><li><a href="#adding-to-widget">Добавление функциональности к элементу "IconNodeWidget"</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>Выберите "File > New Project". В мастере создания проекта выберите "NetBeans Modules" в области "Categories" и "Module" в области "Projects". Нажмите кнопку "Next". Введите <tt>ShapeSample</tt> в поле "Project Name" и укажите соответствующую папку на диске в поле "Project Location". Выберите "Standalone Module" и "Set as Main Project", если эти параметры не выбраны. Нажмите кнопку "Next". |
| |
| <p></p></li><li>Введите <tt>org.netbeans.shapesample</tt> в поле "Code Name Base" и <tt>Shape Sample</tt> в поле "Module Display Name". Нажмите кнопку "Finish". |
| |
| |
| <p></p></li><li>Щелкните проект правой кнопкой мыши, выберите "Properties", щелкните "Libraries" в диалоговом окне "Project Properties" и установите зависимость от следующих интерфейсов API: |
| |
| <p></p><ul> |
| <li>Visual Library API |
| </li><li>Utilities API |
| </li></ul> |
| |
| |
| <p>Нажмите кнопку "OK". |
| |
| </p><p></p></li><li>Щелкните проект модуля правой кнопкой мыши, выберите "New > File/Folder", затем выберите "Window Component" из категории "NetBeans Module Development". Нажмите кнопку "Next". Выберите <tt>editor</tt> в раскрывающемся списке и затем выберите "Open on Application Start". Нажмите кнопку "Next". |
| |
| <p></p></li><li>Введите <tt>Shape</tt> в поле "Class Name Prefix". При необходимости можно добавить значок размером 16x16 пикселей. Нажмите кнопку "Finish".</p> |
| |
| <p>Создается несколько файлов, один из которых – <tt>ShapeTopComponent</tt>. Откройте этот файл в режиме проектирования. Экран должен выглядеть следующим образом: |
| |
| </p><p><img border="1" src="../../images/tutorials/vislib/shapetopcomponent.png"/> |
| |
| |
| </p><p></p></li><li>Щелкните правой кнопкой мыши элемент "TopComponent" в режиме проектирования, выберите "Set Layout" и затем выберите "BorderLayout". |
| |
| </li></ol> |
| |
| |
| <p></p><h2><a name="creating-the-scene"></a>Создание рабочего пространства</h2> |
| |
| <p>Программирование с использованием интерфейса API для Visual Library аналогично программированию в Swing. При этом составляется и изменяется дерево визуальных элементов, именуемых элементами оформления окон (widgets). Корень дерева представлен классом "Scene", содержащим все визуальные характеристики рабочего пространства. Само рабочее пространство также представляет собой элемент оформления окон. Необходимо создать представление рабочего пространства, которое является элементом "JComponent". Затем следует добавить "JComponent" к элементу "JScrollPane". |
| |
| </p><p>В этом разделе представлена процедура добавления элемента "JScrollPane" к "TopComponent". Затем создается новое рабочее пространство. Представление рабочего пространства передается в элемент "TopComponent", что позволяет вывести его в элементе "JScrollPane" элемента "TopComponent". После этого осуществляется установка проекта модуля и вывод на экран первого рабочего пространства.</p> |
| |
| <ol> |
| |
| <li>При помощи окна "Palette" (Ctrl-Shift-8) перетащите <tt>JScrollPane</tt> к элементу "TopComponent". В окне "Inspector" щелкните правой кнопкой мыши <tt>JScrollPane</tt>, выберите "Change Variable Name" и введите <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>Теперь вставьте в конструктор элемента "TopComponent" экземпляр класса <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>Обратите внимание, что создается два представления. Первое – это развернутое представление для визуализации графов, моделей и т.д. Второе – вспомогательное представление с левой стороны элемента "TopComponent". Наличие двух представлений позволит пользователю быстро перемещаться по основному представлению с одновременным обзором всего рабочего пространства.</p> |
| |
| <p>Объявите представление "JComponent": |
| |
| </p><pre class="examplecode">private JComponent myView;</pre> |
| |
| |
| <p></p></li><li>Обеспечивать сохранение состояния элемента "TopComponent" при перезапуске среды IDE не требуется. Напротив, в нашем случае это будет ошибкой. Поэтому замените PERSISTENCE_ALWAYS на PERSISTENCE_NEVER, как показано ниже: |
| |
| <pre class="examplecode">public int getPersistenceType() { |
| return TopComponent.PERSISTENCE_NEVER; |
| }</pre> |
| |
| |
| <p></p></li><li>Щелкните правой кнопкой мыши узел проекта и выберите "Install/Reload in Development IDE". Если появляется предупреждающее сообщение, нажмите кнопку "OK".</p> |
| |
| <p>В процессе установки модуля в списке пунктов меню "Window" появляется новый пункт "Shape". При выборе этого пункта запускается подготовленная реализация интерфейса 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 "Palette"</a>, что позволит создать палитру элементов с фигурами, показанными в начале данного руководства. Затем добавим функциональность перетаскивания, предусмотренную в интерфейсе API для Visual Library, при помощи которой можно будет размещать фигуры в рабочем пространстве путем перетаскивания. После этого расширим рабочее пространство путем добавления дополнительных возможностей, например, масштабирования и перемещения по рабочему пространству. |
| |
| </p><ol> |
| <li>Поскольку это руководство посвящено интерфейсу API для Visual Library, а не интерфейсу "Palette", подробное описание принципов работы последнего здесь не приводится. По этой теме существует достаточно много других руководств (<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 раздела "Начало работы".</p> |
| |
| |
| <p></p></li><li>Затем добавьте палитру к элементу "Lookup" элемента "TopComponent" путем вставки следующей строки в конец конструктора "TopComponent": |
| |
| <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>Окно "Projects" теперь должно выглядеть следующим образом:</p> |
| |
| <p><img border="1" src="../../images/tutorials/vislib/proj-window.png"/> |
| |
| </p><p></p></li><li>Установите модуль еще раз. При вызове элемента "TopComponent" при помощи соответствующего пункта меню справа от рабочего пространства отображается палитра элементов:</p> |
| |
| <p><img border="1" src="../../images/tutorials/vislib/firstpalette.png"/> |
| |
| |
| |
| </p></li> |
| |
| <!-- ===================================================================================== --> |
| <p></p><h2><a name="adding-a-layer-widget"></a>Добавление элемента "LayerWidget"</h2> |
| |
| <p>Элемент <a href="http://graph.netbeans.org/documentation.html#LayerWidget">LayerWidget</a> представляет собой "прозрачный слой" (glasspane), похожий на элемент "JGlassPane" в Swing. Этот элемент прозрачен по умолчанию. Прежде, чем двигаться дальше, добавим элемент "LayerWidget" к рабочему пространству, что позволит в дальнейшем размешать видимые элементы оформления окон путем их перетаскивания в это пространство. |
| |
| </p><ol><li>Объявите элемент "LayerWidget" в классе <tt>GraphSceneImpl</tt>: |
| |
| <pre class="examplecode">private LayerWidget mainLayer;</pre> |
| |
| <p></p></li><li>В конструкторе класса <tt>GraphSceneImpl</tt> добавьте элемент "LayerWidget" как подчиненный элемент рабочего пространства: |
| |
| <pre class="examplecode">mainLayer = new LayerWidget (this); |
| addChild (mainLayer);</pre></li></ol> |
| |
| <p>Теперь при перетаскивании элементов из палитры в рабочее пространство в качестве элементов оформления окон они будут добавляться как подчиненные элементу "LayerWidget". Поскольку элементы "LayerWidget" по умолчанию являются прозрачными, можно добавить множество таких элементов, один над другим, и таким образом вставить в рабочее пространство, например, фоновое изображение. |
| |
| </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>Добавление элемента "IconNodeWidget" с функциональностью перетаскивания</h2> |
| |
| <p>Ранее конструктор класса <tt>GraphSceneImpl</tt> использовался для передачи рабочего пространства в элемент "JScrollPane" элемента "TopComponent". Рабочее пространство существует, однако для него еще не настроено поведение. Для настройки поведения нами будут использоваться действия. В этом разделе будет рассмотрено действие <tt><a href="http://graph.netbeans.org/documentation.html#AcceptAction">AcceptAction</a></tt>. Это действие предоставляет функциональность перетаскивания. Функциональность перетаскивания может применяться в отношении элемента оформления окон, однако в нашем случае она будет применена к самому рабочему пространству. |
| |
| </p><p>Для определения того, что должно происходить при перетаскивании элемента из палитры в пределах рабочего пространства, будет использоваться действие <tt>createAcceptAction</tt>. Здесь задействованы два метода. Первый метод – <tt>isAcceptable()</tt> – позволяет определить приемлемость элемента для рабочего пространства. Таким образом можно протестировать перемещаемый элемент. Также можно определить изображение, которое будет появляться при перетаскивании. Это демонстрируется в примере ниже. Если возвращается <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("org/netbeans/shapesample/palette/shape1.png"); |
| }</pre> |
| |
| <p>Обратите внимание, что можно указать любое произвольное изображение на случай, если вспомогательный метод не возвращает какое-либо изображение. В примере для этого будет использоваться изображение "<tt>shape1.png</tt>".</p> |
| |
| <p></p></li><li>Создайте новый класс с именем <tt>MyNode</tt>. Этот класс представляет узел в графо-ориентированной модели. Он не может быть непосредственно изображением, так как каждый узел в модели должен быть уникальным (это проверяется методом "equals"). Если бы использовались непосредственно изображения, то можно было бы получить только 3 узла в рабочем пространстве (по одному для каждого изображения). При помощи класса "MyNode" можно получить несколько узлов, каждый из которых может иметь свой собственный или совместно используемый экземпляр изображения. |
| |
| <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>, как показано ниже, для получения узла классом реализации "Visual Library":</li> |
| |
| <pre class="examplecode">extends GraphScene<MyNode, String></pre> |
| |
| <p>Подтвердите автоматическое создание средой IDE новых заглушек для абстрактных методов. |
| |
| </p><p>Кроме того, поскольку в нашем примере используются общие объекты, в среде IDE должен присутствовать инструментарий JDK 1.5. Если точная версия неизвестна, щелкните правой кнопкой мыши проект, выберите "Properties" и перейдите на страницу "Sources". В раскрывающемся списке "Source Level" выберите "1.5". |
| |
| </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>Обратите внимание на установку изображения, получаемого от узла. В качестве идентифицирующей метки будет использоваться генерируемое случайное число. По умолчанию элемент оформления окон существует, но его поведение не определено. Для получения возможности перемещения элемента оформления окон в рабочем пространстве необходимо создать действие по перемещению. Перед возвратом элемента оформления окон в рабочее пространство его следует добавить в качестве подчиненного элементу "LayerWidget", который был создан в предыдущем разделе.</p> |
| |
| <p></p></li><li>Перезагрузите модуль и снова откройте окно "Shape".</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>Добавление функциональности к элементу "IconNodeWidget"</h2> |
| |
| <p>Ранее для добавления возможности перемещения элемента оформления окон "IconNodeWidget" к нему было добавлено действие <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>Сначала определим действие "Editor", которое будет добавлено к элементу "IconNodeWidget": |
| |
| <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>Наконец, присвоим действие "Editor" элементу "IconNodeWidget" способом, аналогичным вышеописанной настройке действия "Move": |
| |
| <pre class="examplecode">widget.getLabelWidget().getActions().addAction(editorAction);</pre> |
| |
| <p>Здесь сначала получаем элемент "LabelWidget" элемента оформления окон "IconNodeWidget". Затем к "LabelWidget" добавляется действие "Editor".</p> |
| |
| <p></p></li><li>Среда IDE предложит добавить несколько операторов импорта. В каждом случае следует подтвердить предложенный средой IDE оператор. |
| |
| <p></p></li><li>Затем, в случаях <tt>SelectAction</tt> и <tt>HoverAction</tt>, потребуется лишь присвоить эти действия элементу "IconNodeWidget": |
| |
| <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&subject=Feedback:%20Visual%20Library%20API%20Tutorial%20NetBeans%206.0">Мы ждем ваших отзывов</a></div> |
| <br style="clear:both;" /> |
| |
| |
| <a name="next_steps"></a><h2>Что дальше?</h2> |
| <p>Для получения дополнительной информации о работе с интерфейсом API для "Visual Library" см.:</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> |