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、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
在IT监控领域,RRD(Round Robin Database)和JRobin是两种常见的时序数据库,用于存储和管理时间序列数据,如系统性能指标、网络流量、服务器状态等。这两种技术对于实时监控和分析IT系统的健康状况至关重要。 ...
《JRobin:深入理解与应用》 在Java世界中,数据持久化是一个不可或缺的部分,而JRobin正是这样一个轻量级的、高效的RPM(Ring-Persistent Metrics)存储库,它被广泛用于记录和分析系统性能指标。JRobin-1.5.14....
包含翻译后的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是一种开源的、轻量级的时序数据存储库,专门用于性能监控和日志记录。它被设计为Rrdtool(Round Robin Database Tool)的一个替代品,Rrdtool是由Tobi Oetiker开发的用于存储和...
2. **错误和异常追踪**:当应用程序出现错误或异常时,JavaMelody会记录并显示相关信息,帮助开发者快速定位问题,提高故障排查效率。 3. **资源使用情况**:包括CPU使用率、内存分配与垃圾回收、类加载统计等,...
在本案例中,我们关注的是两个核心的JAR文件:`javamelody-core-1.52.0.jar`和`jrobin-1.5.9.jar`。 `javamelody-core-1.52.0.jar`是JavaMelody的核心组件,包含了实现监控功能的主要类和接口。这个版本的Java...
JRobin是RRDTool的100%纯Java替代品,具有几乎完全相同的规格。 如果向RRDTool和JRobin提供相同的数据,则将获得完全相同的结果和图形。 支持所有标准RRDTool操作。
中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 ...
监控器需要的jar,需在web.xml中配置 <filter-name>monitoring <filter-class>net.bull.javamelody.MonitoringFilter</filter-class> <filter-name>monitoring <url-pattern>/* ...可以进入到监控页面
snmp-tutorialSNMP tutorial :Jrobin、SNMP4jsnmp4j-1x-demoSNMP4j实现同步和异步的GET的示例SNMP4j实现同步和异步的Walk的示例SNMP4j实现Trap的示例SNMP4j实现SET的示例SNMP4j实现GETBLUK的示例robin-demoJRobin ...
这种数据库由JRobin库在Java环境中实现,而JRobin是一个轻量级、高效的RRD工具。 RRD数据库的结构由一系列数据源(Data Sources)和时序更新记录(Archives)组成。数据源代表了你要监控的特定指标,如CPU利用率或...
- `.classpath`:Eclipse项目类路径文件,定义了项目中包含的库和源代码位置。 - `.fbprefs`:可能是FlexBuilder的偏好设置文件。 - `LICENSE.GPL`:GNU General Public License,表明该软件遵循GPL许可协议。 -...
开源的Tomcat性能查看工具提供了强大的功能,帮助管理员实时了解Tomcat的运行状态,及时发现并解决潜在问题,保证服务的稳定性和效率。本文将详细介绍这种工具的主要特点和使用方法,以及与之相关的技术知识点。 ...
3. **msyh.ttc** 和 **msyhbd.ttc**: 这两个文件可能包含的是中文字体,用于在JavaMelody的UI界面中正确显示中文字符,确保在不同系统和配置下都能正确呈现监控信息。 4. **javamelody-c**: 可能是JavaMelody的一个...
8. **国际化支持**: JavaMelody支持多语言界面,包括中文,方便不同地区的用户使用。 9. **可扩展性**: 除了基本的监控功能,JavaMelody还提供了API,允许开发者扩展其功能,例如添加自定义的监控指标。 总的来说...
3. **线程分析**:显示当前运行的线程数量,帮助定位线程阻塞或死锁问题。 4. **数据库监控**:追踪SQL查询的执行时间,找出慢查询,优化数据库性能。 5. **缓存统计**:如果应用程序使用了缓存,JavaMelody可以监控...
其次,JavaMelody提供了线程监控功能,显示当前运行的线程数和每个线程的状态,有助于分析多线程问题,比如死锁或者线程阻塞。对于异常处理,JavaMelody会记录应用程序中抛出的异常,方便定位和解决问题。另外,它还...