`
cleaneyes
  • 浏览: 343546 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JRobin显示中文及位置偏移的问题

J# 
阅读更多

JRobin的默认字体,不直接中文,要显示中文可以对字体做这样的设置(JRobin1.4)

graphDef.setDefaultFont(new Font("monospaced", Font.PLAIN, 11));
		graphDef.setTitleFont(new Font("SansSerif", Font.BOLD, 14));
 

但是使用RrdGraphDef的line方法,legend的值中含中文时,会发生错位的现象。

public void line( String sourceName, Color color, String legend )
 

产生的原因为,JRboin把在同一行的legend拼成一个字符串,进行绘图,而把legend前面的颜色方框分别绘制,颜色方框的x位置,是根据legend的length和计算的;英文字符的宽度大概相关于字体高的0.5倍,而汉字宽度则大于这个倍数,作者没有考虑中文的问题;所以计算出来的位置不正确。


简单解法:

//中文字符个数+1,中文比英文字符多出来的宽度
				int cnChars = 0;
				char[] charArray = tmpStr.toString().toCharArray();  
				for(int k=0; k<charArray.length;k++){  
				   if ((charArray[k] >= 0x4e00)&&(charArray[k] <= 0x9fbb)){  
					   cnChars++;
				   }       
				}  
				cnChars = (int)(cnChars*0.88);
				markerList.addLast( new LegendMarker( (tmpStr.length()+ cnChars) * nfont_width, ((Legend) clist[i]).getColor() ) );
//上面是对源码的修改
				tmpStr.append( "   " );		// Add 3 spaces where the mark will be
 

 

 

均分各列

LinkedList markerList = new LinkedList();

//add		
LinkedList legendList = new LinkedList();

...

if ( clist[i].commentType == Comment.CMT_LEGEND ) 
			{								
				markerList.addLast( new LegendMarker( tmpStr.length() * nfont_width, ((Legend) clist[i]).getColor() ) );
				tmpStr.append( "   " );		// Add 3 spaces where the mark will be
			} 
			else {
				if ( clist[i].commentType == Comment.CMT_GPRINT )
				{
					((Gprint) clist[i]).setValue( sources, sourceIndex, valueFormat );
				}				
				markerList.addLast( null );				
			}
 ...

ArrayList tknpairs = clist[i].getTokens();			
			
			//add 
			if (tknpairs.size() >0){		
				String legend = (String) tknpairs.get(0);
				if ( clist[i].trimString() )
					legendList.addLast(legend.trim());
				else
					legendList.addLast(legend);
			}

...

//替换graphString( g, tmpStr.toString(), posx, posy );到while循环的代码
tmpStr		= new StringBuffer(""); 
					drawText	= false;

					if (!markerList.isEmpty()){
						//一行有几个legend
						int legendCols = markerList.size();
						//两边分别离posx宽的间距,再均分每个legend的间距
						int legendWidth = (imgWidth - posx*2)/legendCols;
						
						int currentCol = 0;
						// Plot the markers	
						while ( !markerList.isEmpty() ) {										
							//绘制颜色方框
							LegendMarker lm = (LegendMarker) markerList.removeFirst();
							//方框的起始位置
							int startPosx = posx + currentCol*legendWidth;					
							g.setColor( lm.getColor() );
							g.fillRect( startPosx, posy - 9, 10, 10 );
							g.setColor( normalFontColor );
							g.drawRect( startPosx, posy - 9, 10, 10 );
							//绘制legend,颜色方框的宽度约为12
							String legend = (String) legendList.removeFirst();
							graphString( g, legend , startPosx + 12, posy );
							
							currentCol++;
						}
					}

 

紧凑排列

//其他代码与均无各列的相同
if (!markerList.isEmpty()){				
						// Plot the markers	
						int startPosx = posx;
						while ( !markerList.isEmpty() ) {										
							//绘制颜色方框
							LegendMarker lm = (LegendMarker) markerList.removeFirst();
							//方框的起始位置										
							g.setColor( lm.getColor() );
							g.fillRect( startPosx, posy - 9, 10, 10 );
							g.setColor( normalFontColor );
							g.drawRect( startPosx, posy - 9, 10, 10 );
							//绘制legend,颜色方框的宽度约为12
							String legend = (String) legendList.removeFirst();
							int legendStartPosx = startPosx + 12;
							graphString( g, legend , legendStartPosx, posy );							
							
							char[] charArray = legend.toCharArray();  
							//中文字符个数+1,中文是英文字符宽度的两倍
							int cnChars = 1;
							for(int k=0; k<charArray.length;k++){  
							   if ((charArray[k] >= 0x4e00)&&(charArray[k] <= 0x9fbb)){  
								   cnChars++;
							   }       
							}  
							//下一个方框开始的位置为,本legend的起始位置加上legned文字的宽度
							startPosx = legendStartPosx + (legend.length()+ cnChars)*nfont_width;					
						}
					}		
 

 

 

 

原代码如下:

private void plotComments( Graphics2D g ) throws RrdException
	{
		if ( !graphDef.showLegend() ) return;
		
		LinkedList markerList = new LinkedList();
		
		// Position the cursor just below the chart area
		int posy			= y_offset + chartHeight + CHART_UPADDING + CHART_BPADDING + ( graphDef.showMajorGridX() ? nfont_height : 0 );
		int posx			= LBORDER_SPACE;

		g.setColor( normalFontColor );
		g.setFont( normal_font );
		
		Comment[] clist		= graphDef.getComments();
		StringBuffer tmpStr	= new StringBuffer("");

		boolean newLine		= false;
		boolean drawText	= false;
		
		for (int i = 0; i < clist.length; i++)
		{
			if ( clist[i].commentType == Comment.CMT_LEGEND ) 
			{
				markerList.addLast( new LegendMarker( tmpStr.length() * nfont_width, ((Legend) clist[i]).getColor() ) );
				tmpStr.append( "   " );		// Add 3 spaces where the mark will be
			} 
			else if ( clist[i].commentType == Comment.CMT_GPRINT )
				((Gprint) clist[i]).setValue( sources, sourceIndex, valueFormat );
			
			ArrayList tknpairs = clist[i].getTokens();
			
			for (int j = 0; j < tknpairs.size(); j++)
			{
				String str 	= (String) tknpairs.get(j++);
				Byte tkn	= (Byte) tknpairs.get(j);
				
				if ( clist[i].trimString() )
					tmpStr.append( str.trim() );
				else
					tmpStr.append( str );
					
				if ( tkn != Comment.TKN_NULL )
				{
					drawText = true;
					if ( tkn == Comment.TKN_ALF ) {
						newLine	= true;
						posx	= LBORDER_SPACE;					
					} 
					else if ( tkn == Comment.TKN_ARF ) {
						newLine	= true;
						posx 	= imgWidth - RBORDER_SPACE - (tmpStr.length() * nfont_width);
					}
					else if ( tkn == Comment.TKN_ACF ) {
						newLine	= true;
						posx 	= imgWidth / 2 - (tmpStr.length() * nfont_width) / 2;
					}
					else if ( tkn == Comment.TKN_AL )
						posx	= LBORDER_SPACE;
					else if ( tkn == Comment.TKN_AR )
						posx 	= imgWidth - RBORDER_SPACE - (tmpStr.length() * nfont_width);
					else if ( tkn == Comment.TKN_AC )
						posx 	= imgWidth / 2 - (tmpStr.length() * nfont_width) / 2;
				}
				
				if ( !newLine && clist[i].addSpacer() )
					tmpStr.append( SPACER );
								
				// Plot the string
				if ( drawText ) {
					
					graphString( g, tmpStr.toString(), posx, posy );
					tmpStr		= new StringBuffer(""); 
					drawText	= false;

					// Plot the markers	
					while ( !markerList.isEmpty() ) {
						LegendMarker lm = (LegendMarker) markerList.removeFirst();
						g.setColor( lm.getColor() );
						g.fillRect( posx + lm.getXPosition(), posy - 9, 10, 10 );
						g.setColor( normalFontColor );
						g.drawRect( posx + lm.getXPosition(), posy - 9, 10, 10 );
					}
				}
				
				if ( newLine ) {
					posy 	+= nfont_height + LINE_PADDING;
					newLine	= false;
				}
				
			}
		}
		
		if ( tmpStr.length() > 0)
		{
			posx		= LBORDER_SPACE;
			graphString( g, tmpStr.toString(), posx, posy );
			tmpStr		= new StringBuffer(""); 
			drawText	= false;

			// Plot the markers	
			while ( !markerList.isEmpty() ) {
				LegendMarker lm = (LegendMarker) markerList.removeFirst();
				g.setColor( lm.getColor() );
				g.fillRect( posx + lm.getXPosition(), posy - 9, 10, 10 );
				g.setColor( normalFontColor );
				g.drawRect( posx + lm.getXPosition(), posy - 9, 10, 10 );
			}			
		}
	}
 

 

 

 

分享到:
评论

相关推荐

    jrobin-1.5.9-API文档-中文版.zip

    标签:jrobin、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    RRD与JRobin

    在IT监控领域,RRD(Round Robin Database)和JRobin是两种常见的时序数据库,用于存储和管理时间序列数据,如系统性能指标、网络流量、服务器状态等。这两种技术对于实时监控和分析IT系统的健康状况至关重要。 ...

    jrobin-1.5.14.jar和源代码

    《JRobin:深入理解与应用》 在Java世界中,数据持久化是一个不可或缺的部分,而JRobin正是这样一个轻量级的、高效的RPM(Ring-Persistent Metrics)存储库,它被广泛用于记录和分析系统性能指标。JRobin-1.5.14....

    jrobin-1.5.9-API文档-中英对照版.zip

    包含翻译后的API文档:jrobin-1.5.9-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.jrobin:jrobin:1.5.9; 标签:jrobin、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器...

    JRobin 流量报表

    **JRobin 流量报表详解** ...通过深入了解和应用 JRobin,您可以更好地管理系统的流量数据,及时发现潜在问题,提升系统运行效率和稳定性。无论是在企业级应用还是个人项目中,JRobin 都能成为您强大的流量监控工具。

    jrobin学习例子程序

    学习用jrobin绘图的绝佳例子程序 学习用jrobin绘图的绝佳例子程序

    jrobin流量监控代码

    **Jrobin流量监控代码详解** Jrobin是一种开源的、轻量级的时序数据存储库,专门用于性能监控和日志记录。它被设计为Rrdtool(Round Robin Database Tool)的一个替代品,Rrdtool是由Tobi Oetiker开发的用于存储和...

    javaMelody+jrobin jar文件 .rar

    2. **错误和异常追踪**:当应用程序出现错误或异常时,JavaMelody会记录并显示相关信息,帮助开发者快速定位问题,提高故障排查效率。 3. **资源使用情况**:包括CPU使用率、内存分配与垃圾回收、类加载统计等,...

    JavaMelody javamelody-core-1.52.0.jar jrobin-1.5.9.jar

    在本案例中,我们关注的是两个核心的JAR文件:`javamelody-core-1.52.0.jar`和`jrobin-1.5.9.jar`。 `javamelody-core-1.52.0.jar`是JavaMelody的核心组件,包含了实现监控功能的主要类和接口。这个版本的Java...

    JRobin-开源

    JRobin是RRDTool的100%纯Java替代品,具有几乎完全相同的规格。 如果向RRDTool和JRobin提供相同的数据,则将获得完全相同的结果和图形。 支持所有标准RRDTool操作。

    jrobin-1.5.9.jar中文-英文对照文档.zip

    中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 ...

    javamelody.jar和 jrobin.jar

    监控器需要的jar,需在web.xml中配置 &lt;filter-name&gt;monitoring &lt;filter-class&gt;net.bull.javamelody.MonitoringFilter&lt;/filter-class&gt; &lt;filter-name&gt;monitoring &lt;url-pattern&gt;/* ...可以进入到监控页面

    snmp-tutorial:SNMP教程:Jrobin、SNMP4j

    snmp-tutorialSNMP tutorial :Jrobin、SNMP4jsnmp4j-1x-demoSNMP4j实现同步和异步的GET的示例SNMP4j实现同步和异步的Walk的示例SNMP4j实现Trap的示例SNMP4j实现SET的示例SNMP4j实现GETBLUK的示例robin-demoJRobin ...

    RRD环形数据库操作.rar

    这种数据库由JRobin库在Java环境中实现,而JRobin是一个轻量级、高效的RRD工具。 RRD数据库的结构由一系列数据源(Data Sources)和时序更新记录(Archives)组成。数据源代表了你要监控的特定指标,如CPU利用率或...

    javamelody-1.43.0

    - `.classpath`:Eclipse项目类路径文件,定义了项目中包含的库和源代码位置。 - `.fbprefs`:可能是FlexBuilder的偏好设置文件。 - `LICENSE.GPL`:GNU General Public License,表明该软件遵循GPL许可协议。 -...

    开源 tomcat 性能查看工具

    开源的Tomcat性能查看工具提供了强大的功能,帮助管理员实时了解Tomcat的运行状态,及时发现并解决潜在问题,保证服务的稳定性和效率。本文将详细介绍这种工具的主要特点和使用方法,以及与之相关的技术知识点。 ...

    javamelody资料包

    3. **msyh.ttc** 和 **msyhbd.ttc**: 这两个文件可能包含的是中文字体,用于在JavaMelody的UI界面中正确显示中文字符,确保在不同系统和配置下都能正确呈现监控信息。 4. **javamelody-c**: 可能是JavaMelody的一个...

    javamelody性能监控jar和war

    8. **国际化支持**: JavaMelody支持多语言界面,包括中文,方便不同地区的用户使用。 9. **可扩展性**: 除了基本的监控功能,JavaMelody还提供了API,允许开发者扩展其功能,例如添加自定义的监控指标。 总的来说...

    监控JAVA应用的好工具javamelody

    3. **线程分析**:显示当前运行的线程数量,帮助定位线程阻塞或死锁问题。 4. **数据库监控**:追踪SQL查询的执行时间,找出慢查询,优化数据库性能。 5. **缓存统计**:如果应用程序使用了缓存,JavaMelody可以监控...

    JavaMelody JAVA Web项目服务器性能监控工具

    其次,JavaMelody提供了线程监控功能,显示当前运行的线程数和每个线程的状态,有助于分析多线程问题,比如死锁或者线程阻塞。对于异常处理,JavaMelody会记录应用程序中抛出的异常,方便定位和解决问题。另外,它还...

Global site tag (gtag.js) - Google Analytics