小狐貍的JAVA學習小站
          歡迎大家給我傳道、授業、解惑
          posts - 1,comments - 3,trackbacks - 0

             筆者最近公司的新項目需要對網絡設備連接狀態的進行監聽。在網上找啊找,終于發現了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,我是在摸索中學習的,只能簡單的介紹下最基本的應用,由于工作進度,只能先這樣用了,還請各位高手多多指點。下面是我學習摸索時做的小例子, 請大家多提寶貴意見。

            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     * 本程序用于畫網絡拓撲圖
           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("拓撲圖");
           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 */

           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     * 通過點坐標畫線
           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        // 創建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, 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            // 創建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, 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 小狐貍 閱讀(5623) 評論(3)  編輯  收藏 所屬分類: J2SE

          FeedBack:
          # re: 用JGraph實現網絡拓撲圖的嘗試(本博客創刊號)
          2008-09-02 10:17 | zyztt
          e~ 我完全看不懂了 呵呵 ~ 好好學吧  回復  更多評論
            
          # re: zyztt[未登錄]
          2008-09-03 11:14 | 小狐貍
          @zyztt
          要學的東西太多了~~  回復  更多評論
            
          # re: 用JGraph實現網絡拓撲圖的嘗試(本博客創刊號)
          2009-03-27 11:42 | bikelong
          有一個已經在jgraph上實現的topo圖了,
          叫itopoview (www.zhtelecom.com有下載),比較全面。  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 云龙县| 洪江市| 金阳县| 科尔| 青州市| 平阳县| 扶余县| 聂荣县| 凉城县| 双鸭山市| 栾城县| 大庆市| 南京市| 登封市| 新余市| 卓资县| 屏东市| 靖西县| 墨竹工卡县| 睢宁县| 建阳市| 子长县| 营山县| 东明县| 临漳县| 双峰县| 平安县| 淮阳县| 新河县| 桐城市| 稻城县| 正蓝旗| 肥东县| 昭平县| 镇康县| 辽阳县| 闵行区| 六安市| 鄄城县| 枣强县| 滦南县|