一个RCP实现的客户端,服务端传输数据过来客户端就主推到了UI界面,用的是观察者设计模式,在View视图中实现了update方法,这样引来了一个UI线程错误,很偶然会出现数组越界问题,就是没保证UI的变更,没在一条线程的单例下完成。
原先报错的做法是
@Override
public void update(Observable o, final Object arg) {
// TODO Auto-generated method stub
DB_ConStatus dbConn = (DB_ConStatus)arg;
String node = dbConn.getNode();
String svrName = dbConn.getSvrName();
LineChart lineChart = (LineChart)uiMap.get(node+svrName+"lineChart");
if(lineChart==null)return;
List<LineItem> items =lineChart.getItems();
LineItem red = items.get(0);
LineItem green = items.get(1);
double max = dbConn.getAll_conn()+20;
lineChart.setUpperLimit(max);//最大上线数
lineChart.setYScaleValueGap(max/10==0?1:Math.floor(max/10));
red.addValue(dbConn.getAll_conn());//最大连接数
red.setName("最大连接数("+dbConn.getAll_conn()+")");
green.addValue(dbConn.getUsed_conn());//当前连接数
green.setName("当前连接数("+dbConn.getUsed_conn()+")");
String date = dbConn.getSet_date();
String xText = date.substring(8,10)+":"+date.substring(10,12)+":"+date.substring(12,14);
lineChart.addXScaleText(xText);//当前时间
if (lineChart.valueCount() > 15) {
lineChart.removeHead(1);
}
}
这样就很容易出现一个错误,数组越界,一个关乎LineChart使用GUI画图时候的错误,贴下错误。
Exception in thread "AWT-EventQueue-1" java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at twaver.chart.LineChart.A(Unknown Source)
at twaver.chart.LineChart.paintContent(Unknown Source)
at twaver.chart.AbstractScaleChart.paintChart(Unknown Source)
at twaver.chart.A.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(JComponent.java:1027)
at javax.swing.JComponent.paintChildren(JComponent.java:864)
at javax.swing.JComponent.paint(JComponent.java:1036)
at twaver.chart.AbstractChart.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5122)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:277)
at javax.swing.RepaintManager.paint(RepaintManager.java:1217)
at javax.swing.JComponent._paintImmediately(JComponent.java:5070)
at javax.swing.JComponent.paintImmediately(JComponent.java:4880)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
解决方案是使操作UI的操作给Swing自己去管理,加个SwingUtilities.invokeLater();或SwingUtilities.invokeAndWait();
@Override
public void update(Observable o, final Object arg) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
DB_ConStatus dbConn = (DB_ConStatus)arg;
String node = dbConn.getNode();
String svrName = dbConn.getSvrName();
LineChart lineChart = (LineChart)uiMap.get(node+svrName+"lineChart");
if(lineChart==null)return;
List<LineItem> items =lineChart.getItems();
LineItem red = items.get(0);
LineItem green = items.get(1);
double max = dbConn.getAll_conn()+20;
lineChart.setUpperLimit(max);//最大上线数
lineChart.setYScaleValueGap(max/10==0?1:Math.floor(max/10));
red.addValue(dbConn.getAll_conn());//最大连接数
red.setName("最大连接数("+dbConn.getAll_conn()+")");
green.addValue(dbConn.getUsed_conn());//当前连接数
green.setName("当前连接数("+dbConn.getUsed_conn()+")");
String date = dbConn.getSet_date();
String xText = date.substring(8,10)+":"+date.substring(10,12)+":"+date.substring(12,14);
lineChart.addXScaleText(xText);//当前时间
if (lineChart.valueCount() > 15) {
lineChart.removeHead(1);
}
}
});
分享到:
相关推荐
Twaver作为一个图形化工具,它提供了丰富的图形元素、交互操作以及数据绑定功能,使得开发者可以快速构建具有视觉吸引力且功能丰富的应用。 **压缩包子文件的文件名称列表:** 只有一个文件名“alarm”,我们可以...
总的来说,TWaver Flex组件是构建富互联网应用的强大工具,它简化了图形界面的开发,提高了数据管理的灵活性,尤其在处理复杂网络和业务逻辑时表现突出。通过深入理解和熟练运用TWaver Flex,开发者能够快速创建出...
【标题】"TWaver-java-4.1最新 官网试用版jar包及Demo" 涉及的核心知识点是TWaver,一个基于Java的图形可视化库,主要用于...对于需要在Java项目中实现复杂图形展示的开发者来说,TWaver是一个值得探索和使用的工具。
《Twaver Flex中文用户使用手册》是一份专为使用Twaver Flex产品的用户准备的详尽指南,旨在帮助用户深入理解和高效应用这款强大的图形化建模工具。Twaver Flex是一款基于Adobe Flex技术的可视化开发框架,它提供了...
通过这个"TWaver的3d图形组件库,小demo",开发者不仅可以学习到如何使用TWaver库创建3D图形,还能了解到现代Web开发中的3D数据可视化技术和最佳实践。通过研究提供的源代码,开发者可以提升自己在WebGL和JavaScript...
Twaver是一款强大的图形化开发工具,专为创建复杂的网络拓扑图、流程图、组织结构图等而设计,广泛应用于电信系统、网络安全和物联网解决方案中。本教程将深入讲解如何利用Twaver进行高效的数据可视化。 首先,我们...
TWaver是一个强大的数据可视化工具,它提供了丰富的图表类型和交互功能,让数据展示更加直观易懂。 【描述】该开发包的亮点在于其强大的可视化能力,通过TWaver,开发者可以轻松地构建出各种炫酷的图形,如流程图、...
该文档详细介绍了 Twaver Web SVG 的架构、开发流程以及常见问题解决方案等内容,旨在帮助开发者更好地理解和掌握 Twaver Web SVG 的使用方法。 #### 二、简介 ##### 2.1 TWAVER WEBSVG 结构 Twaver Web SVG 采用...
在`TwaverWeb`目录中,可能包含了多个示例代码,这些示例展示了如何使用TWaver创建各种拓扑图和机房展示。通过学习和研究这些代码,开发者可以快速掌握TWaver的用法,将其应用到实际项目中。 综上,TWaver HTML5...
Twaver是一个强大的数据可视化和网络建模工具,广泛应用于网络拓扑、流程图、组织结构等场景。5.9.0是该库的一个特定版本,可能包含了新功能、性能优化或错误修复。 描述简单明了,"twaver-html5-5.9.0-api"直接...
TWaver是一款强大的WebGL3D框架,它为开发者提供了一个高效、灵活的工具,用于创建交互式的3D应用程序,特别是针对网络拓扑和机房管理等场景。本文将深入探讨如何利用TWaver实现3D机房的演示项目。 首先,TWaver的...
【标题】"Twaver Web实例源码"是一个关于使用Twaver与ExtJS结合的Web应用程序开发的学习资源。Twaver是一款强大的图形化建模和可视化工具,常用于数据可视化、网络拓扑图、流程图等场景。ExtJS则是一个流行的...
TWaver Java是一个功能丰富的可视化组件库,适用于构建复杂的图形用户界面(GUI),特别是在网络监控、数据分析和展示应用中。 ### 概述 TWaver Java提供了多种图形组件,包括但不限于网络、树形、表格、树表、...
- **报表工具**:TWaver还可以用于报表工具的开发,利用其丰富的图表组件制作出美观且易于理解的报告。 #### 六、TWaver获取方式与学习资源 TWaver提供了多种获取方式,包括官方购买、试用版下载等途径。此外,...
总的来说,Twaver Java 3.7版本为Java开发者提供了一套强大而灵活的数据可视化工具,无论是在企业应用还是科研项目中,都能发挥其独特价值。通过深入学习和实践,开发者可以构建出极具吸引力的数据可视化应用,以...
Twaver学习案例的例子
Chart组件章节介绍了多种图表组件的使用方法,包括BarChart、LineChart、PieChart、DialChart、BubbleChart和RadarChart等,这些都是用于数据可视化分析的重要工具。 告警的使用章节说明了如何在TWaver HTML5组件中...
Twaver是一款强大的数据可视化和建模工具,广泛应用于网络、系统和业务流程的图形化表示。在3.6.5这个版本中,官方提供了Demo来展示其功能和特性。 【描述】"twaver-flex-3.6.5 官方demo" 意味着用户可以通过这个...