第一个程序:
public class FirstZest {
public static void main(String[] args) {
// SWT
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("First Zest Program Demo");
shell.setLayout(new FillLayout());
shell.setSize(300, 300);
// 创建 Graph
Graph graph = new Graph(shell, SWT.NONE);
// 创建一个图形节点
GraphNode startNode = new GraphNode(graph, SWT.NONE, "Start");
// 创建另外一个图形节点
GraphNode endNode = new GraphNode(graph, SWT.NONE, "End");
// 创建节点关联
new GraphConnection(graph, SWT.NONE, startNode, endNode);
// 设置布局管理器
graph.setLayoutAlgorithm(new SpringLayoutAlgorithm(
LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
// 显示 SWT
shell.open();
while (!shell.isDisposed()) {
while (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
第二个程序:设置图形的图像和连线箭头
public class FirstZest2 {
public static void main(String[] args) {
// SWT
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("First Zest Program Demo");
shell.setLayout(new FillLayout());
shell.setSize(300, 300);
Graph graph = new Graph(shell, SWT.NONE);
graph.setConnectionStyle(ZestStyles.CONNECTIONS_DIRECTED);
Image startIcon = JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO);
GraphNode startNode = new GraphNode(graph, SWT.NONE, "Start", startIcon);
GraphNode endNode = new GraphNode(graph, SWT.NONE, "End");
new GraphConnection(graph, SWT.NONE, startNode, endNode);
graph.setLayoutAlgorithm(new SpringLayoutAlgorithm(
LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
shell.open();
while (!shell.isDisposed()) {
while (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
设置图形的事件,选中的加粗:
public class FirstZest3 {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("First Zest Program Demo");
shell.setLayout(new FillLayout());
shell.setSize(300, 300);
Graph graph = new Graph(shell, SWT.NONE);
GraphNode startNode = new GraphNode(graph, SWT.NONE, "Start");
GraphNode endNode = new GraphNode(graph, SWT.NONE, "End");
new GraphConnection(graph, SWT.NONE, startNode, endNode);
graph.setLayoutAlgorithm(new SpringLayoutAlgorithm(
LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
// 注册对象选择侦听事件
graph.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
List selection = ((Graph) e.widget).getSelection();
// 确认只选择了一个对象
if (selection.size() == 1) {
Object o = selection.get(0);
// 图形节点对象
if (o instanceof GraphNode) {
// 改变边线宽度
((GraphNode) o).setBorderWidth(3);
// 图形关联对象
} else if (o instanceof GraphConnection) {
// 改变连线宽度
((GraphConnection) o).setLineWidth(3);
}
}
}
});
shell.open();
while (!shell.isDisposed()) {
while (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
测试不同的布局管理器算法:
public class FirstZest4 {
public static void main(String[] args) {
// SWT
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("First Zest Program Demo");
shell.setLayout(new FillLayout());
shell.setSize(300, 300);
Graph graph = new Graph(shell, SWT.NONE);
graph.setConnectionStyle(ZestStyles.CONNECTIONS_DIRECTED);
for (int i = 0; i < 10; i++) {
GraphNode node1 = new GraphNode(graph, ZestStyles.NODES_FISHEYE,
"Begin");
GraphNode node2 = new GraphNode(graph, ZestStyles.NODES_FISHEYE,
"Middle");
GraphNode node3 = new GraphNode(graph, ZestStyles.NODES_FISHEYE,
"Finish");
new GraphConnection(graph, SWT.NONE, node1, node2);
new GraphConnection(graph, SWT.NONE, node2, node3);
}
graph.setLayoutAlgorithm(new GridLayoutAlgorithm(
LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
/*
graph.setLayoutAlgorithm(new SpringLayoutAlgorithm(
LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
graph.setLayoutAlgorithm(new RadialLayoutAlgorithm(
LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
graph.setLayoutAlgorithm(new TreeLayoutAlgorithm(
LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
graph.setLayoutAlgorithm(new DirectedGraphLayoutAlgorithm(
LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
*/
// 显示 SWT
shell.open();
while (!shell.isDisposed()) {
while (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
定制布局管理器:
public class FirstZest5 {
public static void main(String[] args) {
// SWT
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("First Zest Program Demo");
shell.setLayout(new FillLayout());
shell.setSize(300, 300);
Graph graph = new Graph(shell, SWT.NONE);
graph.setConnectionStyle(ZestStyles.CONNECTIONS_DIRECTED);
GraphNode node1 = new GraphNode(graph, SWT.NONE, "Node 1");
GraphNode node2 = new GraphNode(graph, SWT.NONE, "Node 2");
GraphNode node3 = new GraphNode(graph, SWT.NONE, "Node 3");
new GraphConnection(graph, SWT.NONE, node1, node2);
new GraphConnection(graph, SWT.NONE, node2, node3);
graph.setLayoutAlgorithm(new AbstractLayoutAlgorithm(SWT.NONE) {
int totalNodes;
protected int getCurrentLayoutStep() {
return 0;
}
protected int getTotalNumberOfLayoutSteps() {
return totalNodes;
}
protected boolean isValidConfiguration(boolean asynchronous,
boolean continuous) {
return true;
}
protected void postLayoutAlgorithm(InternalNode[] entitiesToLayout,
InternalRelationship[] relationshipsToConsider) {
}
protected void preLayoutAlgorithm(InternalNode[] entitiesToLayout,
InternalRelationship[] relationshipsToConsider, double x,
double y, double width, double height) {
}
public void setLayoutArea(double x, double y, double width,
double height) {
}
@Override
protected void applyLayoutInternal(
InternalNode[] entitiesToLayout,
InternalRelationship[] relationshipsToConsider,
double boundsX, double boundsY, double boundsWidth,
double boundsHeight) {
// 需要布局的对象数量
totalNodes = entitiesToLayout.length;
// 设置固定间隔距离
double spcaing = 100;
// 开始位置坐标
int startX = 10;
// 触发布局进程
fireProgressStarted(totalNodes);
// 循环所有对象,按照设定的布局算法来排列对象
for (int curNode = 0; curNode < entitiesToLayout.length; curNode++) {
LayoutEntity layoutEntity = entitiesToLayout[curNode]
.getLayoutEntity();
// 设置一个对象显示的位置
layoutEntity.setLocationInLayout(startX, layoutEntity
.getYInLayout()+10);
// 保持相同的间隔
startX += spcaing;
// 让对象在新位置上显示
fireProgressEvent(curNode, totalNodes);
}
// 结束布局进程
fireProgressEnded(totalNodes);
// TODO Auto-generated method stub
}
}, true);
// 显示 SWT
shell.open();
while (!shell.isDisposed()) {
while (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
定制图形:
public class FirstZest6 {
public static void main(String[] args) {
// SWT
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("First Zest Program Demo");
shell.setLayout(new FillLayout());
shell.setSize(300, 300);
Graph graph = new Graph(shell, SWT.NONE);
GraphNode startNode = new GraphNode(graph, SWT.NONE, "Start");
EllipseGraphNode ellipseNode = new EllipseGraphNode(graph, SWT.NONE, "ellipse");
GraphNode endNode = new GraphNode(graph, SWT.NONE, "End");
// 创建节点关联
new GraphConnection(graph, SWT.NONE, startNode, ellipseNode);
new GraphConnection(graph, SWT.NONE, ellipseNode, endNode);
// 设置布局管理器
graph.setLayoutAlgorithm(new SpringLayoutAlgorithm(
LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
// 显示 SWT
shell.open();
while (!shell.isDisposed()) {
while (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
class EllipseGraphNode extends CGraphNode {
public EllipseGraphNode(IContainer graphModel, int style, IFigure figure) {
super(graphModel, style, figure);
}
public EllipseGraphNode(IContainer graphModel, int style, String name) {
super(graphModel, style, createEllipseFigure(name));
}
private static IFigure createEllipseFigure(String name) {
EllipseFigure circleFigure = new EllipseFigure(name);
circleFigure.setSize(-1, -1);
return circleFigure;
}
}
class EllipseFigure extends Figure {
public EllipseFigure(String name) {
// 定义显示名称
Label label = new Label(name);
// 定义图形节点的显示布局
ToolbarLayout layout = new ToolbarLayout();
setLayoutManager(layout);
setBorder(new LineBorder(ColorConstants.white, 1));
setOpaque(true);
add(label);
}
// 重写这个方法,实现自己需要显示的图形,更多的信息可以参考 Zest 的源代码
@Override
public void paint(Graphics graphics) {
super.paint(graphics);
// 获取默认的矩形信息
Rectangle rectangle = getBounds().getCopy();
graphics.setLineWidth(2);
// 画椭圆
graphics.drawOval(rectangle);
}
}
设置图形不让拖动:
package com.iteye.xmind.draw2d.zest2;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.SWTEventDispatcher;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.zest.core.widgets.Graph;
import org.eclipse.zest.core.widgets.GraphConnection;
import org.eclipse.zest.core.widgets.GraphNode;
import org.eclipse.zest.layouts.LayoutStyles;
import org.eclipse.zest.layouts.algorithms.SpringLayoutAlgorithm;
public class FirstZest7 {
public static void main(String[] args) {
// SWT
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("First Zest Program Demo");
shell.setLayout(new FillLayout());
shell.setSize(300, 300);
// 创建 Graph
Graph graph = new Graph(shell, SWT.NONE);
// 创建一个图形节点
GraphNode startNode = new GraphNode(graph, SWT.NONE, "Start");
// 创建另外一个图形节点
GraphNode endNode = new GraphNode(graph, SWT.NONE, "End");
// 创建节点关联
new GraphConnection(graph, SWT.NONE, startNode, endNode);
// 设置布局管理器
graph.setLayoutAlgorithm(new SpringLayoutAlgorithm(
LayoutStyles.NO_LAYOUT_NODE_RESIZING), true);
graph.getLightweightSystem().setEventDispatcher(
new SWTEventDispatcher() {
public void dispatchMouseMoved(MouseEvent me) {
List selection = ((Graph) me.widget).getSelection();
for (Iterator iterator = selection.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
if (object instanceof GraphNode) {
String nodeName = ((GraphNode) object).getText();
if ("Start".equalsIgnoreCase(nodeName)) {
// 如果是 Start 图形节点,就无法被移动
} else {
// 其他图形节点,不受影响
super.dispatchMouseMoved(me);
}
}
}
}
});
// 显示 SWT
shell.open();
while (!shell.isDisposed()) {
while (!display.readAndDispatch()) {
display.sleep();
}
}
}
}