筆者最近公司的新項目需要對網絡設備連接狀態的進行監聽。在網上找啊找,終于發現了JGraph這個開源的開發包可以利用。雖然用起來還是比較麻煩,但總比自己用SWING,AWT慢慢寫要輕松許多。
下面簡單介紹下最近摸索JGraph的用法(復雜的用法還沒有研究出來),首先是整個的畫布,JGraph的畫布有一個GraphModel,畫面上所有的對象都要添加在GraphModel中。其次是畫面上的各種元素, JGraph將圖元定義為一個一個的cell,每個cell可以是一個頂點(Vertex)、邊(Edge)或者節點(Port)中的一種。頂點可以有鄰接的頂點,他們通過邊相聯系,邊連接的兩個端點稱為目標和源,每個目標或者源是一個節點。節點是頂點的孩子。每個cell都可以有自己的孩子。然后是為畫布和畫面上的元素添加屬性。
每個cell的外觀由相應的屬性定義,屬性序列是指一系列的鍵-值對,他們以Map形式組織,例如:
// 創建LOCAL SERVER對象及屬性
DefaultGraphCell LocServer = new DefaultGraphCell("LOCAL SERVER");
Map LocServerattrib = new Hashtable();
attributes.put(LocServer, LocServerattrib);
GraphConstants.setIcon(LocServerattrib, icon);
GraphConstants.setBorder(LocServerattrib, BorderFactory
.createCompoundBorder());
GraphConstants.setEditable(LocServerattrib, false);
最后是添加事件,JGraph里有一個BasicMarqueeHandler類,應該是用來捕捉事件的,我的鼠標雙擊事件如下:
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
Object[] obj = BasicMarqueeHandler.getGraphForEvent(e)
.getSelectionCells();
if (obj.length != 0) {
System.out.println(obj[obj.length - 1].toString());
}
}
}
對于JGraph,我是在摸索中學習的,只能簡單的介紹下最基本的應用,由于工作進度,只能先這樣用了,還請各位高手多多指點。下面是我學習摸索時做的小例子, 請大家多提寶貴意見。
1
package example;
2
3
import java.awt.BorderLayout;
4
import java.awt.event.MouseEvent;
5
import java.awt.event.MouseListener;
6
import java.awt.geom.Rectangle2D;
7
import java.awt.Dimension;
8
import java.awt.Font;
9
import java.awt.Color;
10
11
import java.util.Hashtable;
12
import java.util.Map;
13
14
import javax.swing.BorderFactory;
15
import javax.swing.Icon;
16
import javax.swing.ImageIcon;
17
import javax.swing.JFrame;
18
import javax.swing.JPanel;
19
import javax.swing.JScrollPane;
20
21
import org.jgraph.JGraph;
22
import org.jgraph.graph.BasicMarqueeHandler;
23
import org.jgraph.graph.ConnectionSet;
24
import org.jgraph.graph.DefaultEdge;
25
import org.jgraph.graph.DefaultGraphCell;
26
import org.jgraph.graph.DefaultGraphModel;
27
import org.jgraph.graph.DefaultPort;
28
import org.jgraph.graph.GraphConstants;
29
import org.jgraph.graph.GraphModel;
30
31
public class topology
{
32
/** *//**
33
* 本程序用于畫網絡拓撲圖
34
*/
35
public static void main(String[] args)
{
36
JFrame frame = new topologyFrame(4);
37
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
38
frame.setVisible(true);
39
}
40
}
41
42
/** *//**
43
* 主畫面
44
*/
45
class topologyFrame extends JFrame
{
46
private static final int DEFAULT_WIDTH = 1024;
47
private static final int DEFAULT_HEIGHT = 768;
48
49
public topologyFrame(int iNumber)
{
50
this.setTitle("拓撲圖");
51
this.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
52
53
final topologyPanel panel = new topologyPanel(iNumber);
54
this.add(panel, BorderLayout.CENTER);
55
56
}
57
}
58
59
/** *//**
60
* 拓撲圖面板
61
*/
62
class topologyPanel extends JPanel
{
63
private static final int PANEL_WIDTH = 1024;
64
private static final int PANEL_HEIGHT = 768;
65
private static final int SERVER_WIDTH = 64;
66
private static final int SERVER_HEIGHT = 96;
67
private static final int LINE_LENGTH = 250;
68
private static final String IMAGE_DIR = "D:\\testimg\\SERVER.jpg";
69
70
public topologyPanel(int iServerNum)
{
71
setSize(PANEL_WIDTH, PANEL_HEIGHT);
72
this.add(new JScrollPane(setTopologyMaker(iServerNum)));
73
}
74
75
/** *//**
76
* 通過點坐標畫線
77
*/
78
private JGraph setTopologyMaker(int iServer)
{
79
80
GraphModel model = new DefaultGraphModel();
81
Object[] cells = null;
82
final JGraph graph = new JGraph(model);
83
graph.setSelectionEnabled(true);
84
graph.addMouseListener(new MouseEventDemo());
85
Map attributes = new Hashtable();
86
Map LocServerattrib = new Hashtable();
87
Icon icon = new ImageIcon(IMAGE_DIR);
88
double iAngle = 0;
89
90
graph.setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
91
graph.setAutoResizeGraph(false);
92
graph.setSizeable(false);
93
graph.setLocation(0, 0);
94
graph.setSize(PANEL_WIDTH, PANEL_HEIGHT);
95
96
// 創建LOCAL SERVER對象及屬性
97
DefaultGraphCell LocServer = new DefaultGraphCell("LOCAL SERVER");
98
attributes.put(LocServer, LocServerattrib);
99
GraphConstants.setIcon(LocServerattrib, icon);
100
GraphConstants.setBorder(LocServerattrib, BorderFactory
101
.createCompoundBorder());
102
GraphConstants.setEditable(LocServerattrib, false);
103
104
// 中心顯示本地SERVER
105
attributes.put(LocServer, LocServerattrib);
106
Rectangle2D LocServerbounds = new Rectangle2D.Double(graph.getWidth() / 2
107
- SERVER_WIDTH / 2, graph.getHeight() / 2 - SERVER_HEIGHT / 2,
108
SERVER_WIDTH, SERVER_HEIGHT);
109
GraphConstants.setBounds(LocServerattrib, LocServerbounds);
110
GraphConstants.setValue(LocServerattrib, "LOCAL SERVER");
111
GraphConstants.setFont(LocServerattrib, new Font(null, Font.BOLD, 10));
112
113
DefaultPort LocPort = new DefaultPort();
114
LocServer.add(LocPort);
115
116
cells = new Object[]
{ LocServer };
117
model.insert(cells, attributes, null, null, null);
118
119
if (iServer != 0)
{
120
iAngle = 360 / iServer;
121
} else
{
122
iAngle = 0;
123
}
124
125
for (int i = 0; i < iServer; i++)
{
126
double x;
127
double y;
128
129
x = graph.getWidth()
130
/ 2
131
+ (java.lang.Math.cos(((iAngle) * i + 45)
132
* java.lang.Math.PI / 180) * LINE_LENGTH)
133
- SERVER_WIDTH / 2;
134
y = graph.getHeight()
135
/ 2
136
- (java.lang.Math.sin(((iAngle) * i + 45)
137
* java.lang.Math.PI / 180) * LINE_LENGTH)
138
- SERVER_HEIGHT / 2;
139
140
// 創建PEER SERVER對象及屬性
141
DefaultGraphCell peerServer = new DefaultGraphCell("PEER SERVER"
142
+ (i + 1));
143
Map PeerServerattrib = new Hashtable();
144
attributes.put(peerServer, PeerServerattrib);
145
GraphConstants.setIcon(PeerServerattrib, icon);
146
GraphConstants.setBorder(PeerServerattrib, BorderFactory
147
.createCompoundBorder());
148
GraphConstants.setEditable(PeerServerattrib, false);
149
150
attributes.put(peerServer, PeerServerattrib);
151
152
Rectangle2D PeerMTAbounds = new Rectangle2D.Double(x, y, SERVER_WIDTH,
153
SERVER_HEIGHT);
154
// System.out.println("(" + x + "," + y + ")");
155
GraphConstants.setBounds(PeerServerattrib, PeerMTAbounds);
156
GraphConstants.setValue(PeerServerattrib, "PEER SERVER" + (i + 1));
157
GraphConstants
158
.setFont(PeerServerattrib, new Font(null, Font.BOLD, 10));
159
160
DefaultPort PeerPort = new DefaultPort();
161
peerServer.add(PeerPort);
162
163
// 創建邊對象及屬性
164
DefaultEdge edge = new DefaultEdge();
165
Map edgeattrib = new Hashtable();
166
attributes.put(edge, edgeattrib);
167
int arrow = GraphConstants.ARROW_NONE;
168
GraphConstants.setLineEnd(edgeattrib, arrow);
169
GraphConstants.setEditable(edgeattrib, false);
170
GraphConstants.setLabelAlongEdge(edgeattrib, true);
171
GraphConstants.setEndFill(edgeattrib, true);
172
GraphConstants.setDisconnectable(edgeattrib, false);
173
GraphConstants.setValue(edgeattrib, "R" + (i + 1));
174
GraphConstants.setFont(edgeattrib, new Font(null, Font.BOLD, 10));
175
GraphConstants.setLineColor(edgeattrib, Color.GREEN);
176
GraphConstants.setLineWidth(edgeattrib, 1.5f);
177
178
// 連接邊的兩個節點
179
ConnectionSet cs = new ConnectionSet(edge, LocPort, PeerPort);
180
181
cells = new Object[]
{ edge, peerServer };
182
183
// 向model添加cells對象
184
model.insert(cells, attributes, cs, null, null);
185
186
}
187
return graph;
188
}
189
}
190
191
class MouseEventDemo implements MouseListener
{
192
193
public void mouseClicked(MouseEvent e)
{
194
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1)
{
195
Object[] obj = BasicMarqueeHandler.getGraphForEvent(e)
196
.getSelectionCells();
197
if (obj.length != 0)
{
198
System.out.println(obj[obj.length - 1].toString());
199
}
200
}
201
}
202
203
public void mouseEntered(MouseEvent e)
{
204
// System.out.println("mouseEntered");
205
}
206
207
public void mouseExited(MouseEvent e)
{
208
// System.out.println("mouseExited");
209
}
210
211
public void mousePressed(MouseEvent e)
{
212
// System.out.println("mousePressed");
213
}
214
215
public void mouseReleased(MouseEvent e)
{
216
// System.out.println("mouseReleased");
217
}
218
}
posted on 2008-08-29 10:08
小狐貍 閱讀(5623)
評論(3) 編輯 收藏 所屬分類:
J2SE