TWaver - 專注UI技術

          http://twaver.servasoft.com/
          posts - 171, comments - 191, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          瞧咱辦公室的拓撲圖

          Posted on 2010-09-14 18:41 TWaver 閱讀(2328) 評論(3)  編輯  收藏

          前幾天看了《Swing版小小網管》讓我想起前陣子做過的一個企業網管項目。客戶是一個工廠,搞生產制造的。人并不多,四、五十人,多數是車間工人。辦公室的也就二十多人,網絡結構并不復雜:ADSL寬帶接入,加上幾個AP進行信號擴展;臺式機、服務器、筆記本電腦,加上零星的手機上網,僅此而已。大伙知道做企業網管是比較艱難的,工作量大,吃力不討好,競爭激烈,賣不了幾個錢。但是為了能夠在項目中多點籌碼,界面還是要做的精益求精才行。

          先到工廠詳細調研了網絡結構圖,并繪制了一個簡單的草圖結構:

          其中ADSL和幾個無線AP是網絡主干,各個辦公室的結構都是星形結構,通過網線進行匯聚,通過AP進行互聯。使用AP的原因是工廠正在進行改造,幾個辦公室之間距離較遠,隔著一個大院子,網線鋪設不便。

          要在網管里面呈現和監控這個網絡,對俺來說不算難事。不過我需要一個好看一點的流量監控的圖表。首先通過SNMP獲取AP中的iftable中的端口,并獲取其實時流量,然后放置在拓撲圖的link對象中。為了不給網絡造成太多負擔,網管默認每5秒鐘獲取一次數值,并存儲連續100個數值,多余的拋棄。

          繪制chart的圖并不復雜,整個chart呈一個長矩形狀,分為三段(老、中、輕),用不同的顏色進行渲染。

           1public void paintIcon(Component c, Graphics g, int x, int y) {
           2    Graphics2D g2d = (Graphics2D) g;
           3
           4    Rectangle bounds = getBounds();
           5
           6    g2d.setColor(background);
           7    g2d.fill(bounds);
           8
           9    Point location = bounds.getLocation();
          10    int startX = location.x;
          11    int startY = location.y + chartHeight;
          12    GeneralPath path = new GeneralPath();
          13    path.moveTo(startX, startY);
          14
          15    int[] values = getChartDataValues();
          16
          17    for (int i = 0; i < values.length; i++{
          18        path.lineTo(startX + i, startY - values[i]);
          19    }

          20    path.lineTo(startX + chartWidth, startY);
          21    path.closePath();
          22
          23    g2d.setColor(chartColor1);
          24    g2d.fill(path);
          25
          26    //clip center part, paint with color2.
          27    Shape oldClip = g2d.getClip();
          28    Rectangle clip = new Rectangle(bounds.x + chartWidth / 4, bounds.y, chartWidth / 2, chartHeight);
          29    g2d.setClip(clip);
          30    g2d.setColor(chartColor2);
          31    g2d.fill(path);
          32    g2d.setClip(oldClip);
          33
          34    g2d.setColor(Color.lightGray);
          35    g2d.draw(bounds);
          36
          37    g2d.setColor(Color.darkGray);
          38    g2d.setFont(font);
          39
          40    int textX = location.x + 5;
          41    int textY = location.y + chartHeight / 2 + font.getSize() / 2;
          42    g2d.drawString("Sum", textX, textY);
          43
          44    int speed = 100;
          45    if (getElementUI().getElement() instanceof MyLink) {
          46        speed = ((MyLink) getElementUI().getElement()).getSpeed();
          47    }

          48    String text = NumberFormat.getInstance().format(speed) + " kbit/s";
          49    Rectangle2D textBounds = g2d.getFontMetrics().getStringBounds(text, g2d);
          50    textX = (int) (location.x + chartWidth - textBounds.getWidth() - 5);
          51    g2d.drawString(text, textX, textY);
          52}

          53

          顯示效果如下:

          另外,對連線的效果也進行了一些處理。用直線連接無疑太土氣了,來點曲線增加一點趣味。曲線用一個對稱的拋物線來處理,根據不同的角度進行自動調整:

           1public GeneralPath getPath() {
           2    Point from = this.getFromPoint();
           3    Point to = this.getToPoint();
           4    Point middle = new Point((from.x + to.x) / 2, (from.y + to.y) / 2);
           5    boolean wider = (Math.abs(from.x - to.x) > Math.abs(from.y - to.y));
           6    GeneralPath myPath = new GeneralPath();
           7    myPath.moveTo(from.x, from.y);
           8    if (wider) {
           9        myPath.quadTo(middle.x, from.y, middle.x, middle.y);
          10        myPath.quadTo(middle.x, to.y, to.x, to.y);
          11    }
           else {
          12        myPath.quadTo(from.x, middle.y, middle.x, middle.y);
          13        myPath.quadTo(to.x, middle.y, to.x, to.y);
          14    }

          15
          16    return myPath;
          17}

          18

          下圖顯示了幾個這種path的效果:

          接下來,再把SNMP獲得的數據放入link中的chart呈現。為了避免泄密的麻煩,附件的demo俺去掉了這些業務代碼,用一個thread模擬代替了:

           1    Thread thread = new Thread() {
           2
           3        private Vector links = null;
           4
           5        private Vector getLinks() {
           6            if (links == null{
           7                links = new Vector();
           8                Iterator it = network.getDataBox().iterator();
           9                while (it.hasNext()) {
          10                    Object o = it.next();
          11                    if (o instanceof MyLink) {
          12                        MyLink link = (MyLink) o;
          13                        links.add(link);
          14                    }

          15                }

          16            }

          17            return links;
          18        }

          19
          20        @Override
          21        public void run() {
          22            while (true{
          23                Iterator it = getLinks().iterator();
          24                while (it.hasNext()) {
          25                    Object o = it.next();
          26                    if (o instanceof MyLink) {
          27                        MyLink link = (MyLink) o;
          28                        createRandomValue(link);
          29                        if (TWaverUtil.getRandomInt(10== 1{
          30                            link.setSpeed(TWaverUtil.getRandomInt(10000));
          31                        }

          32                    }

          33                }

          34                try {
          35                    Thread.sleep(100);
          36                }
           catch (Exception ex) {
          37                    ex.printStackTrace();
          38                }

          39            }

          40        }

          41
          42        private void createRandomValue(MyLink link) {
          43            int value = link.getLastChartValue();
          44            int change = TWaverUtil.getRandomInt(3- 1;
          45            value = value + change;
          46
          47            value = Math.min(value, 100);
          48            value = Math.max(value, 0);
          49
          50            link.addChartValue(value);
          51        }

          52    }
          ;
          53    thread.start();
          54}
          55

          再到google上物色幾個清爽的圖標。

          對了,在結束之際,突然想起一件事:AP上的晃悠悠的電線絲,可不是icon的一部反,而是咱draw上去的!這個小亮點咱得說說:主要思路就是new一個path,模擬其曲線的路徑,然后在Swing的paint時候給附加上去。代碼如下:

           1@Override
           2public void paintBody(Graphics2D g2d) {
           3    super.paintBody(g2d);
           4
           5    if (((MyNode) getElement()).isWireVisible()) {
           6        Object oldValue = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
           7        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
           8        g2d.setColor(wireColor);
           9        g2d.setStroke(TWaverConst.BASIC_STROKE);
          10        g2d.draw(createWireShape());
          11        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, oldValue);
          12    }

          13}

          14
          15private Shape createWireShape() {
          16    Point point = this.getHotspot();
          17    int x = point.x - 25;
          18    int y = point.y + 23;
          19
          20    GeneralPath path = new GeneralPath();
          21    path.moveTo(x, y);
          22    path.curveTo(x + 20, y - 20, x + 50, y - 10, x + 48, y);
          23    path.curveTo(x + 48, y + 15, x + 10, y + 10, x + 12, y - 5);
          24    path.curveTo(x + 12, y - 20, x + 50, y - 20, x + 53, y);
          25    path.quadTo(x + 53, y + 3, x + 51, y + 5);
          26    return path;
          27}

          28

          這下終于完整了。看看“晃悠悠的鐵絲”效果:

          接下來,在程序里面整合一下,整個效果就出來了:

          為了和大家共同學習和交流,附上的源代碼是從項目中抽取了Swing展示部分,去掉了所有業務邏輯,僅僅為了和大家共享Swing的展示能力,以及拓撲圖的制作思路。

          在這里可以下載全部源代碼、可執行文件、圖標資源等內容。


          評論

          # re: 瞧咱辦公室的拓撲圖  回復  更多評論   

          2010-09-15 09:36 by freeman1984
          這文章不知在哪見過

          # re: 瞧咱辦公室的拓撲圖  回復  更多評論   

          2010-09-15 16:11 by TWaver
          @freeman1984
          可能也是我們的TWaver成員發在其他網站上的

          # re: 瞧咱辦公室的拓撲圖  回復  更多評論   

          2010-09-19 16:47 by 相信
          首頁有兩個相同的文章啦...不過還是贊一個..很酷.

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


          網站導航:
           
          主站蜘蛛池模板: 车致| 建德市| 怀宁县| 迁西县| 巴彦淖尔市| 定陶县| 福安市| 桓台县| 弥勒县| 博乐市| 承德县| 新兴县| 康定县| 瓮安县| 韶关市| 淅川县| 宣恩县| 舟山市| 霍州市| 平安县| 弥勒县| 南澳县| 邹平县| 偏关县| 苗栗市| 贞丰县| 铁岭市| 西乌珠穆沁旗| 合山市| 大同市| 犍为县| 阿拉善右旗| 清镇市| 延吉市| 叙永县| 阿拉尔市| 扶余县| 哈尔滨市| 宁德市| 冷水江市| 通海县|