| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| |
| = Учебный курс по NetBeans Visual Library для приложений Java |
| :jbake-type: platform_tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :icons: font |
| :experimental: |
| :description: Учебный курс по NetBeans Visual Library для приложений Java - Apache NetBeans |
| :keywords: Apache NetBeans Platform, Platform Tutorials, Учебный курс по NetBeans Visual Library для приложений Java |
| |
| В этом учебном курсе вы узнаете, как использовать основные свойства, предлагаемые link:http://bits.netbeans.org/dev/javadoc/org-netbeans-api-visual/overview-summary.html[интерфейсом API NetBeans Visual Library]. |
| |
| |
| |
| |
| |
| *Для работы с этим учебным курсом требуются программное обеспечение и ресурсы, перечисленные в таблице ниже.* |
| |
| |
| В этом учебном курсе используются 3 значка. Щелкните каждый значок правой кнопкой мыши и сохраните их локально. После создания приложения в рамках данного учебного курса скопируйте значки в папку приложения. Вот эти 3 значка: |
| |
| |
| image::images/vislib_red.gif[] |
| image::images/vislib_blue.gif[] |
| image::images/vislib_green.gif[] |
| |
| |
| == Настройка приложения |
| |
| В этом разделе для создания приложения Java будет использован мастер. |
| |
| |
| [start=1] |
| 1. Выберите "File" > "New Project" (Ctrl+Shift+N). В области "Categories" выберите "Java". В области "Projects" выберите "Java Application". Нажмите кнопку "Next". |
| |
| [start=2] |
| 1. На экране "Name and Location" в поле "Project Name" введите ``VisLibDemo`` : |
| |
| |
| image::images/vislib_vislib-java-1.png[] |
| |
| Нажмите кнопку "Finish". |
| |
| В среде IDE будет создан проект ``VisLibDemo`` . К основному пакету добавьте три приведенных выше изображения. На экране появится следующее окно: |
| |
| |
| image::images/vislib_vislib-java-2.png[] |
| |
| |
| == Добавление библиотек |
| |
| В этом разделе добавляем две библиотеки, которые необходимы для работы с Visual Library. |
| |
| |
| [start=1] |
| 1. Щелкните узел "Libraries" правой кнопкой мыши и выберите команду "Add JAR/Folder". |
| |
| [start=2] |
| 1. Перейдите в каталог установки среды IDE NetBeans. |
| |
| [start=3] |
| 1. В ``platform9/lib`` выберите ``org-openide-util.jar`` . |
| |
| [start=4] |
| 1. В ``platform9/modules`` выберите ``org-netbeans-api-visual.jar`` . |
| |
| Сейчас вам потребуются только два файла JAR. На экране появится следующее окно: |
| |
| |
| image::images/vislib_vislib-java-3.png[] |
| |
| |
| == Создание контейнера |
| |
| В этом разделе создаем контейнер, в котором будет содержаться ``сцена`` из Visual Library. |
| |
| |
| [start=1] |
| 1. Определите ``Main.java`` следующим образом: |
| |
| [source,java] |
| ---- |
| |
| public class Main extends JPanel { |
| |
| *//Создать элемент JFrame:* |
| public static void main(String[] args) { |
| JFrame frame = new JFrame("Graph test"); |
| frame.setMinimumSize(new Dimension(500, 400)); |
| frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
| frame.setContentPane(new Main()); |
| frame.pack(); |
| frame.setVisible(true); |
| } |
| |
| public Main() { |
| initComponents(); |
| } |
| |
| private void initComponents() { |
| *//Установить макет:* |
| setLayout(new BorderLayout()); |
| *//Создать элемент JScrollPane:* |
| JScrollPane scrollPane = new JScrollPane(); |
| *//Добавить элемент JScrollPane к элементу JPanel:* |
| add(scrollPane, BorderLayout.CENTER); |
| } |
| |
| } |
| |
| ---- |
| |
| |
| [start=2] |
| 1. Запустите приложение. На экране должен появиться простой элемент JFrame: |
| |
| |
| image::images/vislib_vislib-java-4.png[] |
| |
| Теперь у вас есть элемент ``JScrollPane`` и вы готовы к созданию сцены! |
| |
| |
| == Создание элементов оформления |
| |
| В этом разделе мы создадим отдельный класс, содержащий сцену. После чего подключим его к элементу ``JPanel`` . |
| |
| |
| [start=1] |
| 1. Создайте новый класс с именем ``GraphSceneImpl.java`` . |
| |
| [start=2] |
| 1. Разверните его узел GraphScene<String, String>. |
| |
| [start=3] |
| 1. Используйте значок желтой лампочки рядом со средой IDE для добавления операторов импорта и абстрактных методов. На экране появится следующее окно: |
| |
| [source,java] |
| ---- |
| |
| package vislibdemo; |
| |
| import org.netbeans.api.visual.graph.GraphScene; |
| import org.netbeans.api.visual.widget.Widget; |
| |
| public class GraphSceneImpl extends GraphScene<String, String> { |
| |
| @Override |
| protected Widget attachNodeWidget(String arg0) { |
| throw new UnsupportedOperationException("Not supported yet."); |
| } |
| |
| @Override |
| protected Widget attachEdgeWidget(String arg0) { |
| throw new UnsupportedOperationException("Not supported yet."); |
| } |
| |
| @Override |
| protected void attachEdgeSourceAnchor(String arg0, String arg1, String arg2) { |
| throw new UnsupportedOperationException("Not supported yet."); |
| } |
| |
| @Override |
| protected void attachEdgeTargetAnchor(String arg0, String arg1, String arg2) { |
| throw new UnsupportedOperationException("Not supported yet."); |
| } |
| |
| } |
| |
| ---- |
| |
| |
| [start=4] |
| 1. Используем три элемента ``LayerWidgets`` , аналогичные элементам ``JGlassPanes`` в Swing. Объявите их вверху класса: |
| |
| [source,java] |
| ---- |
| |
| private LayerWidget mainLayer; |
| private LayerWidget connectionLayer; |
| private LayerWidget interactionLayer; |
| |
| ---- |
| |
| |
| [start=5] |
| 1. Создайте конструктор, инициализируйте элементы ``LayerWidgets`` и добавьте их в ``сцену`` : |
| |
| [source,java] |
| ---- |
| |
| public GraphSceneImpl() { |
| mainLayer = new LayerWidget(this); |
| connectionLayer = new LayerWidget(this); |
| interactionLayer = new LayerWidget(this); |
| addChild(mainLayer); |
| addChild(connectionLayer); |
| addChild(interactionLayer); |
| } |
| |
| ---- |
| |
| |
| [start=6] |
| 1. Затем определите, что будет происходить при создании нового элемента оформления: |
| |
| [source,java] |
| ---- |
| |
| @Override |
| protected Widget attachNodeWidget(String arg) { |
| IconNodeWidget widget = new IconNodeWidget(this); |
| if (arg.startsWith("1")) { |
| widget.setImage(ImageUtilities.loadImage("vislibdemo/red.gif")); |
| } else if (arg.startsWith("2")) { |
| widget.setImage(ImageUtilities.loadImage("vislibdemo/green.gif")); |
| } else { |
| widget.setImage(ImageUtilities.loadImage("vislibdemo/blue.gif")); |
| } |
| widget.setLabel(arg); |
| mainLayer.addChild(widget); |
| return widget; |
| } |
| ---- |
| |
| Вышестоящий код выполняется при вызове в сцене элемента ``addNode`` . |
| |
| |
| [start=7] |
| 1. В конце конструктора выполните вышеуказанный метод 4 раза: |
| |
| [source,java] |
| ---- |
| |
| Widget w1 = addNode("1. Hammer"); |
| w1.setPreferredLocation(new Point(10, 100)); |
| Widget w2 = addNode("2. Saw"); |
| w2.setPreferredLocation(new Point(100, 250)); |
| Widget w3 = addNode("Nail"); |
| w3.setPreferredLocation(new Point(250, 250)); |
| Widget w4 = addNode("Bolt"); |
| w4.setPreferredLocation(new Point(250, 350)); |
| |
| ---- |
| |
| В вышеуказанном коде вы создали четыре элемента оформления, передали строку и задали позицию элементов оформления. Теперь выполним метод ``attachNodeWidget`` , определенный в предыдущем шаге. Параметр ``arg`` в методе ``attachNodeWidget`` является строкой, которая была передана в элемент ``addNode`` . Поэтому в строке задается метка элемента оформления. Затем элемент оформления добавляется в ``mainLayer`` . |
| |
| |
| [start=8] |
| 1. Вернитесь в класс ``Main.java`` и добавьте строки, выделенные полужирным шрифтом, в метод ``initComponents`` : |
| |
| [source,java] |
| ---- |
| |
| private void initComponents() { |
| //Установить макет: |
| setLayout(new BorderLayout()); |
| //Создать элемент JScrollPane: |
| JScrollPane scrollPane = new JScrollPane(); |
| //Добавить элемент JScrollPane к элементу JPanel: |
| add(scrollPane, BorderLayout.CENTER); |
| *//Создать элемент GraphSceneImpl: |
| GraphScene scene = new GraphSceneImpl(); |
| //Добавить созданный элемент к JScrollPane: |
| scrollPane.setViewportView(scene.createView()); |
| //Добавить элемент SatellitView к сцене: |
| add(scene.createSatelliteView(), BorderLayout.WEST);* |
| } |
| |
| ---- |
| |
| |
| [start=9] |
| 1. Запустите приложение. На экране появится следующее окно: |
| |
| |
| image::images/vislib_vislib-java-5.png[] |
| |
| Теперь у вас есть сцена с несколькими элементами оформления. Можно начинать интегрирование действий! |
| |
| |
| == Активация действий |
| |
| В этом разделе мы активируем действия для элементов оформления, созданных выше. |
| |
| |
| [start=1] |
| 1. Измените метод ``attachNodeWidget`` путем добавления строк, выделенных полужирным шрифтом: |
| |
| [source,java] |
| ---- |
| |
| @Override |
| protected Widget attachNodeWidget(String arg) { |
| IconNodeWidget widget = new IconNodeWidget(this); |
| if (arg.startsWith("1")) { |
| widget.setImage(ImageUtilities.loadImage("vislibdemo/red.gif")); |
| } else if (arg.startsWith("2")) { |
| widget.setImage(ImageUtilities.loadImage("vislibdemo/green.gif")); |
| } else { |
| widget.setImage(ImageUtilities.loadImage("vislibdemo/blue.gif")); |
| } |
| *widget.getActions().addAction( |
| ActionFactory.createAlignWithMoveAction( |
| mainLayer, interactionLayer, |
| ActionFactory.createDefaultAlignWithMoveDecorator()));* |
| widget.setLabel(arg); |
| mainLayer.addChild(widget); |
| return widget; |
| } |
| |
| ---- |
| |
| |
| [start=2] |
| 1. Запустите приложение. Попробуйте перетащить элемент оформления в другое место. Обратите внимание на появившиеся маркеры выравнивания, которые помогают пользователю разместить элемент оформления с учетом других элементов оформления: |
| |
| |
| image::images/vislib_vislib-java-7.png[] |
| |
| |
| [start=3] |
| 1. Измените класс ``GraphSceneImpl`` , добавив строку, указанную ниже, в конец конструктора: |
| |
| [source,java] |
| ---- |
| |
| getActions().addAction(ActionFactory.createZoomAction()); |
| |
| ---- |
| |
| |
| [start=4] |
| 1. Запустите приложение. Прокрутите колесико мыши или измените масштаб другим способом, принятым в вашей операционной системе, и обратите внимание, что вся сцена увеличивается или уменьшается в размере. |
| |
| [start=5] |
| 1. Добавьте пользовательский класс ``ConnectProvider`` в конце ``GraphSceneImpl`` : |
| |
| [source,java] |
| ---- |
| |
| private class MyConnectProvider implements ConnectProvider { |
| |
| public boolean isSourceWidget(Widget source) { |
| return source instanceof IconNodeWidget && source != null? true : false; |
| } |
| |
| public ConnectorState isTargetWidget(Widget src, Widget trg) { |
| return src != trg && trg instanceof IconNodeWidget ? ConnectorState.ACCEPT : ConnectorState.REJECT; |
| } |
| |
| public boolean hasCustomTargetWidgetResolver(Scene arg0) { |
| return false; |
| } |
| |
| public Widget resolveTargetWidget(Scene arg0, Point arg1) { |
| return null; |
| } |
| |
| public void createConnection(Widget source, Widget target) { |
| ConnectionWidget conn = new ConnectionWidget(GraphSceneImpl.this); |
| conn.setTargetAnchorShape(AnchorShape.TRIANGLE_FILLED); |
| conn.setTargetAnchor(AnchorFactory.createRectangularAnchor(target)); |
| conn.setSourceAnchor(AnchorFactory.createRectangularAnchor(source)); |
| connectionLayer.addChild(conn); |
| } |
| |
| } |
| |
| ---- |
| |
| Подключите пользовательский класс ``ConnectProvider`` в элемент оформления следующим образом: |
| |
| |
| [source,java] |
| ---- |
| |
| @Override |
| protected Widget attachNodeWidget(String arg0) { |
| IconNodeWidget widget = new IconNodeWidget(this); |
| if (arg0.startsWith("1")) { |
| widget.setImage(ImageUtilities.loadImage("vislibdemo/red.gif")); |
| } else if (arg0.startsWith("2")) { |
| widget.setImage(ImageUtilities.loadImage("vislibdemo/green.gif")); |
| } else { |
| widget.setImage(ImageUtilities.loadImage("vislibdemo/blue.gif")); |
| } |
| *widget.getActions().addAction( |
| ActionFactory.createExtendedConnectAction( |
| connectionLayer, new MyConnectProvider()));* |
| widget.getActions().addAction( |
| ActionFactory.createAlignWithMoveAction( |
| mainLayer, interactionLayer, |
| ActionFactory.createDefaultAlignWithMoveDecorator())); |
| widget.setLabel(arg0); |
| mainLayer.addChild(widget); |
| return widget; |
| } |
| |
| ---- |
| |
| |
| [start=6] |
| 1. Запустите приложение, выберите элемент оформления, и перетащите его к другому элементу оформления, удерживая клавишу CTRL. Таким образом можно соединить элементы оформления друг с другом, как показано ниже: |
| |
| |
| image::images/vislib_vislib-java-6.png[] |
| |
| Теперь, после того как вы получили основное представление о функциях интерфейса Visual Library API, ознакомьтесь с разделом "Интерфейсы NetBeans для отображения данных" в link:https://netbeans.apache.org/kb/docs/platform_ru.html[Учебной карте по платформе NetBeans]. |
| |