JFreeChart自学整理

(JFreeChart我就不多介绍了,用过的人都知道它是什么。网上关于这方面的博客也是多得数不胜数,不过感觉多数都是互相抄袭,这点真是不好,浪费后来人的时间,想找点有用的真是难啊,所幸的是还是多少有些有用的,至少教会我在开始阶段如何画出一个漂亮图形出来。这里贴一些网上没有找到的,我看源码总结出来的东西,希望对后来人有所助益,同时也是对自己的理解进行一次剖析和检查,纯属个人自学总结,错误在所难免,欢迎指教,共同探讨)

首先一个图要表达某个意思最重要的肯定是数据,下面就先从数据开始分析:

0维键值对:KeyedValue
继承于Value,添加了一个对应的关键字(Key)。
默认实现DefaultKeyedValue中具有私有成员Comparable key和Number value,这中对应关系不多说了。
1维数值:Values
拥有一个一维数值型数组,从这些数据里我们没法知道这些数据所代表的意义是什么。我们可以把它想象成一个List<Number>,但不要认为它就是一个List,它只是一个接口,没有任何实现。
1维键值对:KeyedValues
继承于Values,为每个Value增加了对应的关键字(Keys),此时我们能够明白每个数据值对应的意义(即Key)。它是个什么东西呢?它也是个接口。如果为了理解的方便,暂且也可以把它想象成一个HashMap<Key, Value>,但也请一定记得它绝对不是HashMap,甚至它的实现类的实现方式和HashMap的实现方式完全不一样。
可以看到它的默认实现DefaultKeyedValues中,分别用了一个ArrayList 来保存keys 和values ,甚至还另外添加了一个HashMap来专门保存key值及其索引(这个在编者我看来是怎么也想不通的,感觉真的没有必要,key都保存在了List里,索引自然也是可以根据indexOf方法获取,如果说是因为HashMap里有key值唯一性,List没有,那样也是可以用indexOf方法先去找达到相同的效果的,想不通,想不通了???)
2维数值:Values2D
此时相当于一个二维数组,有行有列,可以获取行数和列数,并且可以根据给定行列值获取对应数据值。这里的二维怎么表示呢?用二维数组?当然可以实现,可是会不会方便呢?
2维键值对:KeyedValues2D
同样,继承于Values2D的它自然也是有了键值对,不多啰嗦,看它默认实现。
在DefaultKeyedValues2D中三个私有List和一个用于判断是否排列关键字的bool值(这个暂时别管了)。它是如何实现二维键值对的呢?当然是靠这三个List,想想KeyedValues的实现方式,它们肯定神似。不卖关子了,它是用一个List保存rowKeys,用另一个保存KeyedValues(KeyedValues可以有columnKeys和Values的对应关系),成了。不要怀疑还有一个List哪去了,那个List用来保存columnKeys了。

Dataset数据集,字面翻译过来就这样叫。这个可称得上最底层的接口做了什么呢?它就标明所有的图表数据集都必须有一个事件监听器和一个数据集ID...
根据数据类型生成不一样的图数据集,与KeyedValue生成的默认的类DefaultKeyedValueDataset私有成员就是一个KeyedValue;与KeyedValues生成的默认的类DefaultKeyedValuesDataset就直接派生于DefaultPieDataset,DefaultPieDataset中的私有成员就是一个DefaultKeyedValues(饼图的数据确实是一维键值对,很符合这种数据类型,可是插在这里让我感到很不解,按理放在DefaultKeyedValuesDataset不是让人更好理解吗?);而DefaultKeyedValues2DDataset则派生于DefaultCategoryDataset,DefaultCategoryDataset中的私有成员则是一个DefaultKeyedValues2D(还是一样的,又有插队的……)
不同的数据类型适合不同类型的图,DefaultKeyedValueDataset只有一个数据我还真的想不出适合什么图,或许可以作为一般的说明图,直接在图旁边标识;而DefaultKeyedValuesDataset适合的图当然是饼图了,而最后一种适合的就是柱状图。
肯定有朋友会问折线图的数据类型了,折线图的确太普遍了,很多地方都用(先不管X唯一不唯一),同样我们可以用一个List保存X值,另一个List保存Y值,似乎可以,同样的多折线图,可以用KeyedValues2D对应的方法,一个List保存折线键值,另一个List保存一条折线的数据,是不是真的没有问题?是不是真的是这样实现的呢?
有没有问题我不知道,我可以告诉你的是它不是这样实现的,而是换了一种思维(这样看来我的思维还是太死板了,不会变通)。
它是如何实现的呢?
从最底层,‘DataItem系列’,其实没有这个类或者接口,但有相关的类,如XYDataItem、TimeSeriesDataItem……XYDataItem中两个数值型私有成员,分别用来保存X、Y值,而TimeSeriesDataItem一个RegularTimePeriod类型,一个Number类型,分别用来保存时间和数值。(RegularTimePeriod的子类
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值