筆者最近公司的新項(xiàng)目需要對(duì)網(wǎng)絡(luò)設(shè)備連接狀態(tài)的進(jìn)行監(jiān)聽。在網(wǎng)上找啊找,終于發(fā)現(xiàn)了JGraph這個(gè)開源的開發(fā)包可以利用。雖然用起來還是比較麻煩,但總比自己用SWING,AWT慢慢寫要輕松許多。
下面簡(jiǎn)單介紹下最近摸索JGraph的用法(復(fù)雜的用法還沒有研究出來),首先是整個(gè)的畫布,JGraph的畫布有一個(gè)GraphModel,畫面上所有的對(duì)象都要添加在GraphModel中。其次是畫面上的各種元素, JGraph將圖元定義為一個(gè)一個(gè)的cell,每個(gè)cell可以是一個(gè)頂點(diǎn)(Vertex)、邊(Edge)或者節(jié)點(diǎn)(Port)中的一種。頂點(diǎn)可以有鄰接的頂點(diǎn),他們通過邊相聯(lián)系,邊連接的兩個(gè)端點(diǎn)稱為目標(biāo)和源,每個(gè)目標(biāo)或者源是一個(gè)節(jié)點(diǎn)。節(jié)點(diǎn)是頂點(diǎn)的孩子。每個(gè)cell都可以有自己的孩子。然后是為畫布和畫面上的元素添加屬性。
每個(gè)cell的外觀由相應(yīng)的屬性定義,屬性序列是指一系列的鍵-值對(duì),他們以Map形式組織,例如:
// 創(chuàng)建LOCAL SERVER對(duì)象及屬性
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里有一個(gè)BasicMarqueeHandler類,應(yīng)該是用來捕捉事件的,我的鼠標(biāo)雙擊事件如下:
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());
}
}
}
對(duì)于JGraph,我是在摸索中學(xué)習(xí)的,只能簡(jiǎn)單的介紹下最基本的應(yīng)用,由于工作進(jìn)度,只能先這樣用了,還請(qǐng)各位高手多多指點(diǎn)。下面是我學(xué)習(xí)摸索時(shí)做的小例子, 請(qǐng)大家多提寶貴意見。
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
* 本程序用于畫網(wǎng)絡(luò)拓?fù)鋱D
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("拓?fù)鋱D");
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
* 拓?fù)鋱D面板
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
* 通過點(diǎn)坐標(biāo)畫線
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
// 創(chuàng)建LOCAL SERVER對(duì)象及屬性
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
// 創(chuàng)建PEER SERVER對(duì)象及屬性
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
// 創(chuàng)建邊對(duì)象及屬性
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
// 連接邊的兩個(gè)節(jié)點(diǎn)
179
ConnectionSet cs = new ConnectionSet(edge, LocPort, PeerPort);
180
181
cells = new Object[]
{ edge, peerServer };
182
183
// 向model添加cells對(duì)象
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
小狐貍 閱讀(5622)
評(píng)論(3) 編輯 收藏 所屬分類:
J2SE