- 浏览: 220897 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
Wangwei86609:
非常好的规则引擎框架,支持决策树和多线程运行规则https:/ ...
规则引擎 -
hzxlb910:
真详细,收藏哈
maven setting.xml配置说明 -
东方胜:
[b][/b]
脚本语言 Tcl -
345161974:
hyw520110 写道345161974 写道这个Visua ...
Visual Tcl Binary 完整版(完美中文支持) -
hyw520110:
345161974 写道这个Visual Tcl Binary ...
Visual Tcl Binary 完整版(完美中文支持)
前几天的《Swing版小小网管》让我想起前阵子做过的一个企业网管项目。客户是一个工厂,搞生产制造的。人并不多,四、五十人,多数是车间工人。办公室的也就二十多人,网络结构并不复杂:ADSL宽带接入,加上几个AP进行信号扩展;台式机、服务器、笔记本电脑,加上零星的手机上网,仅此而已。大伙知道:做企业网管是比较艰难的,工作量大,吃力不讨好,竞争激烈,卖不了几个钱,不容易啊!但是为了能够在项目中多点筹码,界面还是要做的精益求精才行。
先到工厂详细调研了网络结构图,并绘制了一个简单的草图结构(不好意思,写字越来越难看了,还不如我小学时候的水平,都是电脑键盘给害的哈):
其中ADSL和几个无线AP是网络主干,各个办公室的结构都是星形结构,通过网线进行汇聚,通过AP进行互联。我问工厂的车间主任为啥这样搞,他说使用AP的原因是工厂正在进行改造,几个办公室之间距离较远,隔着一个大院子,网线铺设不便;另外几个车间里头也有电脑需要联网,在嘈杂混乱火星直冒的车间里头,弄网线就更麻烦了。
要在网管里面呈现和监控这个网络,对俺来说不算难事。不过我需要一个好看一点的流量监控的图表。首先通过SNMP获取AP中的iftable中的端口,并获取其实时流量,然后放置在拓扑图的link对象中。为了不给网络造成太多负担,网管默认每5秒钟获取一次数值,并存储连续100个数值,多余的抛弃。
绘制chart的图并不复杂,整个chart呈一个长矩形状,分为三段(老、中、轻),用不同的颜色进行渲染。
- public void paintIcon(Component c, Graphics g, int x, int y) {
- Graphics2D g2d = (Graphics2D) g;
- Rectangle bounds = getBounds();
- g2d.setColor(background);
- g2d.fill(bounds);
- Point location = bounds.getLocation();
- int startX = location.x;
- int startY = location.y + chartHeight;
- GeneralPath path = new GeneralPath();
- path.moveTo(startX, startY);
- int[] values = getChartDataValues();
- for (int i = 0; i < values.length; i++) {
- path.lineTo(startX + i, startY - values[i]);
- }
- path.lineTo(startX + chartWidth, startY);
- path.closePath();
- g2d.setColor(chartColor1);
- g2d.fill(path);
- //clip center part, paint with color2.
- Shape oldClip = g2d.getClip();
- Rectangle clip = new Rectangle(bounds.x + chartWidth / 4, bounds.y, chartWidth / 2, chartHeight);
- g2d.setClip(clip);
- g2d.setColor(chartColor2);
- g2d.fill(path);
- g2d.setClip(oldClip);
- g2d.setColor(Color.lightGray);
- g2d.draw(bounds);
- g2d.setColor(Color.darkGray);
- g2d.setFont(font);
- int textX = location.x + 5;
- int textY = location.y + chartHeight / 2 + font.getSize() / 2;
- g2d.drawString("Sum", textX, textY);
- int speed = 100;
- if (getElementUI().getElement() instanceof MyLink) {
- speed = ((MyLink) getElementUI().getElement()).getSpeed();
- }
- String text = NumberFormat.getInstance().format(speed) + " kbit/s";
- Rectangle2D textBounds = g2d.getFontMetrics().getStringBounds(text, g2d);
- textX = (int) (location.x + chartWidth - textBounds.getWidth() - 5);
- g2d.drawString(text, textX, textY);
- }
public void paintIcon(Component c, Graphics g, int x, int y) { Graphics2D g2d = (Graphics2D) g; Rectangle bounds = getBounds(); g2d.setColor(background); g2d.fill(bounds); Point location = bounds.getLocation(); int startX = location.x; int startY = location.y + chartHeight; GeneralPath path = new GeneralPath(); path.moveTo(startX, startY); int[] values = getChartDataValues(); for (int i = 0; i < values.length; i++) { path.lineTo(startX + i, startY - values[i]); } path.lineTo(startX + chartWidth, startY); path.closePath(); g2d.setColor(chartColor1); g2d.fill(path); //clip center part, paint with color2. Shape oldClip = g2d.getClip(); Rectangle clip = new Rectangle(bounds.x + chartWidth / 4, bounds.y, chartWidth / 2, chartHeight); g2d.setClip(clip); g2d.setColor(chartColor2); g2d.fill(path); g2d.setClip(oldClip); g2d.setColor(Color.lightGray); g2d.draw(bounds); g2d.setColor(Color.darkGray); g2d.setFont(font); int textX = location.x + 5; int textY = location.y + chartHeight / 2 + font.getSize() / 2; g2d.drawString("Sum", textX, textY); int speed = 100; if (getElementUI().getElement() instanceof MyLink) { speed = ((MyLink) getElementUI().getElement()).getSpeed(); } String text = NumberFormat.getInstance().format(speed) + " kbit/s"; Rectangle2D textBounds = g2d.getFontMetrics().getStringBounds(text, g2d); textX = (int) (location.x + chartWidth - textBounds.getWidth() - 5); g2d.drawString(text, textX, textY); }
显示效果如下:
另外,对连线的效果也进行了一些处理。用直线连接无疑太土气了,来点曲线增加一点趣味。曲线用一个对称的抛物线来处理,根据不同的角度进行自动调整:
- public GeneralPath getPath() {
- Point from = this.getFromPoint();
- Point to = this.getToPoint();
- Point middle = new Point((from.x + to.x) / 2, (from.y + to.y) / 2);
- boolean wider = (Math.abs(from.x - to.x) > Math.abs(from.y - to.y));
- GeneralPath myPath = new GeneralPath();
- myPath.moveTo(from.x, from.y);
- if (wider) {
- myPath.quadTo(middle.x, from.y, middle.x, middle.y);
- myPath.quadTo(middle.x, to.y, to.x, to.y);
- } else {
- myPath.quadTo(from.x, middle.y, middle.x, middle.y);
- myPath.quadTo(to.x, middle.y, to.x, to.y);
- }
- return myPath;
- }
public GeneralPath getPath() { Point from = this.getFromPoint(); Point to = this.getToPoint(); Point middle = new Point((from.x + to.x) / 2, (from.y + to.y) / 2); boolean wider = (Math.abs(from.x - to.x) > Math.abs(from.y - to.y)); GeneralPath myPath = new GeneralPath(); myPath.moveTo(from.x, from.y); if (wider) { myPath.quadTo(middle.x, from.y, middle.x, middle.y); myPath.quadTo(middle.x, to.y, to.x, to.y); } else { myPath.quadTo(from.x, middle.y, middle.x, middle.y); myPath.quadTo(to.x, middle.y, to.x, to.y); } return myPath; }
- Thread thread = new Thread() {
- private Vector links = null;
- private Vector getLinks() {
- if (links == null) {
- links = new Vector();
- Iterator it = network.getDataBox().iterator();
- while (it.hasNext()) {
- Object o = it.next();
- if (o instanceof MyLink) {
- MyLink link = (MyLink) o;
- links.add(link);
- }
- }
- }
- return links;
- }
- @Override
- public void run() {
- while (true) {
- Iterator it = getLinks().iterator();
- while (it.hasNext()) {
- Object o = it.next();
- if (o instanceof MyLink) {
- MyLink link = (MyLink) o;
- createRandomValue(link);
- if (TWaverUtil.getRandomInt(10) == 1) {
- link.setSpeed(TWaverUtil.getRandomInt(10000));
- }
- }
- }
- try {
- Thread.sleep(100);
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- }
- private void createRandomValue(MyLink link) {
- int value = link.getLastChartValue();
- int change = TWaverUtil.getRandomInt(3) - 1;
- value = value + change;
- value = Math.min(value, 100);
- value = Math.max(value, 0);
- link.addChartValue(value);
- }
- };
- thread.start();
Thread thread = new Thread() { private Vector links = null; private Vector getLinks() { if (links == null) { links = new Vector(); Iterator it = network.getDataBox().iterator(); while (it.hasNext()) { Object o = it.next(); if (o instanceof MyLink) { MyLink link = (MyLink) o; links.add(link); } } } return links; } @Override public void run() { while (true) { Iterator it = getLinks().iterator(); while (it.hasNext()) { Object o = it.next(); if (o instanceof MyLink) { MyLink link = (MyLink) o; createRandomValue(link); if (TWaverUtil.getRandomInt(10) == 1) { link.setSpeed(TWaverUtil.getRandomInt(10000)); } } } try { Thread.sleep(100); } catch (Exception ex) { ex.printStackTrace(); } } } private void createRandomValue(MyLink link) { int value = link.getLastChartValue(); int change = TWaverUtil.getRandomInt(3) - 1; value = value + change; value = Math.min(value, 100); value = Math.max(value, 0); link.addChartValue(value); } }; thread.start(); }
对了,在结束之际,突然想起一件事:AP上的晃悠悠的电线丝,可不是icon的一部反,而是咱draw上去的!这个小亮点咱得说说:主要思路就是new一个path,模拟其曲线的路径,然后在Swing的paint时候给附加上去。代码如下:
- @Override
- public void paintBody(Graphics2D g2d) {
- super.paintBody(g2d);
- if (((MyNode) getElement()).isWireVisible()) {
- Object oldValue = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g2d.setColor(wireColor);
- g2d.setStroke(TWaverConst.BASIC_STROKE);
- g2d.draw(createWireShape());
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, oldValue);
- }
- }
- private Shape createWireShape() {
- Point point = this.getHotspot();
- int x = point.x - 25;
- int y = point.y + 23;
- GeneralPath path = new GeneralPath();
- path.moveTo(x, y);
- path.curveTo(x + 20, y - 20, x + 50, y - 10, x + 48, y);
- path.curveTo(x + 48, y + 15, x + 10, y + 10, x + 12, y - 5);
- path.curveTo(x + 12, y - 20, x + 50, y - 20, x + 53, y);
- path.quadTo(x + 53, y + 3, x + 51, y + 5);
- return path;
- }
@Override public void paintBody(Graphics2D g2d) { super.paintBody(g2d); if (((MyNode) getElement()).isWireVisible()) { Object oldValue = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(wireColor); g2d.setStroke(TWaverConst.BASIC_STROKE); g2d.draw(createWireShape()); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, oldValue); } } private Shape createWireShape() { Point point = this.getHotspot(); int x = point.x - 25; int y = point.y + 23; GeneralPath path = new GeneralPath(); path.moveTo(x, y); path.curveTo(x + 20, y - 20, x + 50, y - 10, x + 48, y); path.curveTo(x + 48, y + 15, x + 10, y + 10, x + 12, y - 5); path.curveTo(x + 12, y - 20, x + 50, y - 20, x + 53, y); path.quadTo(x + 53, y + 3, x + 51, y + 5); return path; }
这下终于完整了。看看“晃悠悠的铁丝”效果:
接下来,在程序里面整合一下,整个效果就出来了:
为了和大家共同学习和交流,附上的源代码是从项目中抽取了Swing展示部分,去掉了所有业务逻辑,仅仅为了和大家共享Swing的展示能力,以及拓扑图的制作思路。虽然不是惊世骇俗美轮美奂,但是俺比较喜欢这种简洁、清新的风格。
老规矩,有代码共享。在这里可以下载全部源代码、可执行文件、图标资源等内容。
祝大家编程愉快!
发表评论
-
非常有用的在线项目管理资源
2010-12-03 21:05 1146项目管理是一个长期并 ... -
windows右键cmd
2010-09-08 19:29 1027多人都很喜欢在CMD命令行下来操作计算机,我也是其中之一。 如 ... -
超现实主义的经典黑色语录
2009-09-25 10:27 22031.无理取闹,必有所图! 2.幸福是个比较级,要有东西垫底 ... -
Rational Rose建模工具破解方法
2009-03-05 09:04 1233http://www.21php.com/Rational R ... -
Groovy WebSite Generator(Groovy 网站生成器)开源啦
2009-02-27 17:11 990Groovy WebSite Generator(Groovy ... -
五分钟使你的Firefox快两倍
2009-01-15 10:26 8401 、启用流水线技术 浏览器通常都是发送请求到服务器,然后等待 ... -
基于硬件指纹的软件加密和注册技术
2008-11-01 12:36 1491在软件加密保护技术中,一种常用的保护方法就是基于硬件指纹进行许 ... -
需求分析师的职责
2008-10-31 17:45 1909项目快要启动了, ... -
软件开发工程师的未来
2008-10-31 17:43 1111悲哀,你选择开发工程 ... -
转载销售知识
2008-10-31 17:30 1250与立志做销售的同学分 ... -
别在前进的途中迷失自己
2008-10-24 16:06 855下面是陈总给的一些建议。因为自己是个笨人,先记录下来,以防忘 ... -
绝妙:永不过期的刷Q币技巧 - bh
2008-09-11 15:15 930我本来是想做个教程的,但是我又嫌麻烦,本人太懒了,所以就发个帖 ... -
上班族的真实写照
2008-09-11 15:12 1073班族的真实写照
相关推荐
在IT领域,网络拓扑图是一种重要的工具,用于可视化地表示计算机网络的结构和组件之间的连接。Java网络拓扑图的实现通常是通过编程语言(如Java)与前端框架(如Vue.js)结合来完成的,以创建交互式的、可自定义的...
阿里云网络拓扑图阿里云网络拓扑图阿里云网络拓扑图阿里云网络拓扑图阿里云网络拓扑图阿里云网络拓扑图阿里云网络拓扑图阿里云网络拓扑图阿里云网络拓扑图阿里云网络拓扑图阿里云网络拓扑图阿里云网络拓扑图阿里云...
拓扑图通常包含父节点和子节点的概念,这里的描述"父节点点开有子节点,子节点点开,有子节点的子节点..."揭示了拓扑图的递归和层次性。在这样的图形中,用户可以通过点击父节点来展开其子节点,进一步探索更深层次...
在网络架构与设计领域中,拓扑图是一种非常重要的工具,它可以帮助我们清晰地了解网络的结构和布局。根据提供的信息,“网络逻辑拓扑图和详细拓扑图”这一主题涉及到了网络拓扑图的不同层次和细节程度。接下来,我们...
在IT领域,网络拓扑图是一种直观展示网络设备、连接关系和流量走向的图形化工具。使用Qt框架来实现网络拓扑图,可以利用其强大的图形界面和事件处理能力,为用户创建交互式且可自定义的网络表示。本文将深入探讨如何...
网络系统拓扑图网络系统拓扑图网络系统拓扑图网络系统拓扑图网络系统拓扑图网络系统拓扑图网络系统拓扑图网络系统拓扑图网络系统拓扑图网络系统拓扑图网络系统拓扑图网络系统拓扑图网络系统拓扑图网络系统拓扑图网络...
在"QT实现网络拓扑图"这个主题中,我们将深入探讨如何利用QT中的QGraphicsView、QGraphicsPixmapItem和QGraphicsLineItem模块来构建一个多层子网的网络拓扑图表。 QGraphicsView是QT中的一个关键组件,它是用来展示...
思科实验拓扑图思科实验拓扑图思科实验拓扑图思科实验拓扑图思科实验拓扑图
电厂 MIS 功能图 拓扑图 电厂 MIS 功能图 拓扑图 电厂 MIS 功能图 拓扑图
等保2.0 三级 拓扑图+设备套餐+详解.pdf等保2.0 三级 拓扑图+设备套餐+详解.pdf等保2.0 三级 拓扑图+设备套餐+详解.pdf等保2.0 三级 拓扑图+设备套餐+详解.pdf等保2.0 三级 拓扑图+设备套餐+详解.pdf等保2.0 三级 ...
**标题解析:** "wpf 网络拓扑图" 指的是使用Windows Presentation Foundation(WPF)技术创建的展示网络设备间连接关系的图形界面。这种拓扑图通常用于显示网络设备如服务器、交换机、路由器等在逻辑或物理上的连接...
在IT领域,网络拓扑图是一种直观展示网络设备和连接关系的图形表示,它有助于管理和维护复杂的网络系统。本文将深入探讨如何使用C# WinForm结合Microsoft Visio库来实现网络拓扑图的绘制和交互功能。 首先,C#作为...
现代化,信息化,网络化的图书馆网络拓扑图。。。
网络安全等级保护拓扑图大全(100张网络安全架构拓扑图).pdf
**JTOPO纯前端拓扑图** JTOPO是一款强大的前端拓扑图绘制库,它专为构建网络、系统和业务流程的可视化解决方案而设计。这个DEMO是完全基于前端实现的,不依赖任何后端服务,而是使用模拟数据来展示其功能。这使得...
网络拓扑绘图 网络拓扑绘图 网络拓扑绘图 网络拓扑绘图
在IT行业中,拓扑图是一种重要的可视化工具,用于表示网络、系统或进程之间的关系和连接。在本场景中,我们关注的是"C#拓扑图",这是一个基于C#编程语言实现的拓扑图示例,可能被应用于电信网管系统中,以便监控和...
等保2.0 三级 拓扑图+设备套餐+详解 (2).docx等保2.0 三级 拓扑图+设备套餐+详解 (2).docx等保2.0 三级 拓扑图+设备套餐+详解 (2).docx等保2.0 三级 拓扑图+设备套餐+详解 (2).docx等保2.0 三级 拓扑图+设备套餐+...
在Windows窗体应用程序中,使用C#来绘制网络拓扑图是一项常见的任务,尤其是在系统管理和监控领域。网络拓扑图可以清晰地展示网络设备、服务器、交换机、路由器等元素之间的连接关系,帮助管理员理解网络架构,进行...
在IT领域,网络拓扑图是表示网络设备、服务器、线路等元素间连接关系的图形化表示,对于网络管理员来说,它至关重要,因为它能够直观地展示网络结构,帮助理解和管理复杂的网络环境。 Qunee网络拓扑图主要由以下几...