`

TWaver报表工具使用的GUI线程安全问题

阅读更多
  一个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.js使用示例

    Twaver作为一个图形化工具,它提供了丰富的图形元素、交互操作以及数据绑定功能,使得开发者可以快速构建具有视觉吸引力且功能丰富的应用。 **压缩包子文件的文件名称列表:** 只有一个文件名“alarm”,我们可以...

    twaver flex 中文用户使用手册

    《Twaver Flex中文用户使用手册》是一份专为使用Twaver Flex产品的用户准备的详尽指南,旨在帮助用户深入理解和高效应用这款强大的图形化建模工具。Twaver Flex是一款基于Adobe Flex技术的可视化开发框架,它提供了...

    TWaver的3d图形组件库,小demo

    通过这个"TWaver的3d图形组件库,小demo",开发者不仅可以学习到如何使用TWaver库创建3D图形,还能了解到现代Web开发中的3D数据可视化技术和最佳实践。通过研究提供的源代码,开发者可以提升自己在WebGL和JavaScript...

    twaver 教程

    Twaver是一款强大的图形化开发工具,专为创建复杂的网络拓扑图、流程图、组织结构图等而设计,广泛应用于电信系统、网络安全和物联网解决方案中。本教程将深入讲解如何利用Twaver进行高效的数据可视化。 首先,我们...

    twaver-java-4.1

    TWaver是一个强大的数据可视化工具,它提供了丰富的图表类型和交互功能,让数据展示更加直观易懂。 【描述】该开发包的亮点在于其强大的可视化能力,通过TWaver,开发者可以轻松地构建出各种炫酷的图形,如流程图、...

    Twaver Web SVG 开发说明文档

    该文档详细介绍了 Twaver Web SVG 的架构、开发流程以及常见问题解决方案等内容,旨在帮助开发者更好地理解和掌握 Twaver Web SVG 的使用方法。 #### 二、简介 ##### 2.1 TWAVER WEBSVG 结构 Twaver Web SVG 采用...

    TWaver HTML5 开发指南代码

    在`TwaverWeb`目录中,可能包含了多个示例代码,这些示例展示了如何使用TWaver创建各种拓扑图和机房展示。通过学习和研究这些代码,开发者可以快速掌握TWaver的用法,将其应用到实际项目中。 综上,TWaver HTML5...

    TWaver-java-4.1最新 官网试用版jar包及Demo

    【标题】"TWaver-java-4.1最新 官网试用版jar包及Demo" 涉及的核心知识点是TWaver,一个基于Java的图形可视化库,主要用于...对于需要在Java项目中实现复杂图形展示的开发者来说,TWaver是一个值得探索和使用的工具。

    基于TWaver实现的3D机房Demo

    TWaver是一款强大的WebGL3D框架,它为开发者提供了一个高效、灵活的工具,用于创建交互式的3D应用程序,特别是针对网络拓扑和机房管理等场景。本文将深入探讨如何利用TWaver实现3D机房的演示项目。 首先,TWaver的...

    twaver web实例源码

    【标题】"Twaver Web实例源码"是一个关于使用Twaver与ExtJS结合的Web应用程序开发的学习资源。Twaver是一款强大的图形化建模和可视化工具,常用于数据可视化、网络拓扑图、流程图等场景。ExtJS则是一个流行的...

    twaver-html5-5.9.0-api_html5_-5.9.0-api_twaver_

    Twaver是一个强大的数据可视化和网络建模工具,广泛应用于网络拓扑、流程图、组织结构等场景。5.9.0是该库的一个特定版本,可能包含了新功能、性能优化或错误修复。 描述简单明了,"twaver-html5-5.9.0-api"直接...

    TWaver Java 3.7 Developer Guide

    TWaver Java是一个功能丰富的可视化组件库,适用于构建复杂的图形用户界面(GUI),特别是在网络监控、数据分析和展示应用中。 ### 概述 TWaver Java提供了多种图形组件,包括但不限于网络、树形、表格、树表、...

    TWaver图形界面之道

    - **报表工具**:TWaver还可以用于报表工具的开发,利用其丰富的图表组件制作出美观且易于理解的报告。 #### 六、TWaver获取方式与学习资源 TWaver提供了多种获取方式,包括官方购买、试用版下载等途径。此外,...

    twaver-java-3.7

    总的来说,Twaver Java 3.7版本为Java开发者提供了一套强大而灵活的数据可视化工具,无论是在企业应用还是科研项目中,都能发挥其独特价值。通过深入学习和实践,开发者可以构建出极具吸引力的数据可视化应用,以...

    Twaver-html5.zip

    Twaver学习案例的例子

    twaver-flex-3.6.5 官方demo

    Twaver是一款强大的数据可视化和建模工具,广泛应用于网络、系统和业务流程的图形化表示。在3.6.5这个版本中,官方提供了Demo来展示其功能和特性。 【描述】"twaver-flex-3.6.5 官方demo" 意味着用户可以通过这个...

Global site tag (gtag.js) - Google Analytics