blob: 1fae0502bc7801a49862f35407eec814f489ffec [file] [log] [blame]
//
// 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 &amp;&amp; source != null? true : false;
}
public ConnectorState isTargetWidget(Widget src, Widget trg) {
return src != trg &amp;&amp; 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].