小狐貍的JAVA學(xué)習(xí)小站
          歡迎大家給我傳道、授業(yè)、解惑
          posts - 1,comments - 3,trackbacks - 0

             筆者最近公司的新項(xiàng)目需要對(duì)網(wǎng)絡(luò)設(shè)備連接狀態(tài)的進(jìn)行監(jiān)聽。在網(wǎng)上找啊找,終于發(fā)現(xiàn)了JGraph這個(gè)開源的開發(fā)包可以利用。雖然用起來還是比較麻煩,但總比自己用SWINGAWT慢慢寫要輕松許多。

          下面簡(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)大家多提寶貴意見。

            1package example;
            2
            3import java.awt.BorderLayout;
            4import java.awt.event.MouseEvent;
            5import java.awt.event.MouseListener;
            6import java.awt.geom.Rectangle2D;
            7import java.awt.Dimension;
            8import java.awt.Font;
            9import java.awt.Color;
           10
           11import java.util.Hashtable;
           12import java.util.Map;
           13
           14import javax.swing.BorderFactory;
           15import javax.swing.Icon;
           16import javax.swing.ImageIcon;
           17import javax.swing.JFrame;
           18import javax.swing.JPanel;
           19import javax.swing.JScrollPane;
           20
           21import org.jgraph.JGraph;
           22import org.jgraph.graph.BasicMarqueeHandler;
           23import org.jgraph.graph.ConnectionSet;
           24import org.jgraph.graph.DefaultEdge;
           25import org.jgraph.graph.DefaultGraphCell;
           26import org.jgraph.graph.DefaultGraphModel;
           27import org.jgraph.graph.DefaultPort;
           28import org.jgraph.graph.GraphConstants;
           29import org.jgraph.graph.GraphModel;
           30
           31public 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 */

           45class 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 */

           62class 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(00);
           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, nullnullnull);
          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, nullnull);
          185
          186        }

          187        return graph;
          188    }

          189}

          190
          191class 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

          FeedBack:
          # re: 用JGraph實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D的嘗試(本博客創(chuàng)刊號(hào))
          2008-09-02 10:17 | zyztt
          e~ 我完全看不懂了 呵呵 ~ 好好學(xué)吧  回復(fù)  更多評(píng)論
            
          # re: zyztt[未登錄]
          2008-09-03 11:14 | 小狐貍
          @zyztt
          要學(xué)的東西太多了~~  回復(fù)  更多評(píng)論
            
          # re: 用JGraph實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D的嘗試(本博客創(chuàng)刊號(hào))
          2009-03-27 11:42 | bikelong
          有一個(gè)已經(jīng)在jgraph上實(shí)現(xiàn)的topo圖了,
          叫itopoview (www.zhtelecom.com有下載),比較全面。  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 屯昌县| 荣昌县| 蒙阴县| 南皮县| 荥经县| 鹤壁市| 南京市| 黔西县| 盐源县| 弥渡县| 商南县| 临漳县| 黑河市| 泊头市| 偃师市| 商水县| 宁化县| 林口县| 正蓝旗| 三河市| 南川市| 台江县| 全南县| 黔西| 根河市| 马龙县| 湛江市| 保德县| 白沙| 江油市| 普兰店市| 西和县| 松溪县| 彭阳县| 株洲市| 江孜县| 陈巴尔虎旗| 手机| 孟连| 马鞍山市| 泸水县|