我希望能够用JFreeChart创建类似于下图的条形图,这是一个非常基本的单色条形图,但有一个 "花哨 "的细节:对角线条纹。
这是一个非常基本的单色条形图,但有一个 "花哨 "的细节:对角线条纹。我在想,这可以通过在普通条形图上叠加另一张图片来实现。这张图片的尺寸和条形图一样,有对角线的白色条纹和透明的背景。我不太清楚如何做到这一点,因为我没有什么GUI经验,但我发现了一个 很有用的文章 在JFreeChart的图形上叠加图像,所以我很确定我应该可以做到这一点。但我应该如何创建对角线?
但我应该如何创建对角线条纹呢?我看到我可以将线条从左下角分配到右上角,但不是左上角和右下角的封顶线。我可以以某种方式画在矩形之外(而不是让它包含在图片中)吗?
编辑: 经过一番搜索,我看不出我关于用透明背景覆盖图像的建议是否可行,因为我找不到任何关于如何做到这一点的例子。另一方面,仅仅在矩形上画线可能更容易。
使用渐变填充来绘制线条
在trashgod的提示下,我试着用有尖锐边缘的渐变填充一个形状来模拟线画。这样可以避免大量的计算,而且可能会简单很多。对于粗线条来说效果还算可以,但对于细线条来说就不行了。使用下面的代码可以产生第一张图中的填充。
rect.setSpace(spaceBetweenLines);
Color bg = Color.YELLOW;
Color fg = Color.BLUE;
rect.setPaint(new LinearGradientPaint(
(float) startX, (float) startY, (float) (startX + spaceBetweenLines), (float) (startY + spaceBetweenLines),
new float[] {0,.1f,.1001f}, new Color[] {fg,fg,bg}, MultipleGradientPaint.CycleMethod.REPEAT)
);
使用图形基元绘制线条
虽然比较简单,但在我的情况下并不奏效。更复杂的,但对我来说,更自然的方法是简单地在形状(矩形、圆圈......)上画线。下面的代码被用于制作第二张图片。请注意以下代码的使用 clip(Shape s)
来限制线画到下面的形状。之所以不简单地绘制一个矩形,而是使用 clip()
限制形状是 clip()
操作没有别名,因此产生了锯齿。因此我必须先画出形状以获得平滑的边缘,然后设置夹子以防止即将画线时的溢出,最后再画线。
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(getBackground());
g2.fill(getShape());
g2.setClip(getShape());
// draw diagonal lines
g2.setPaint(getLineColor());
for (int x = (int) this.x, y = (int) (this.y); y - height < (this.y + height + getSpace()); ) {
g2.drawLine(x, y , x + (int) width , y - (int) width);
y += getSpace();
}
在 源码 对于 BarChartDemo1
显示了如何应用 GradientPaint
但你可能想尝试用 LinearGradientPaint
来获得对角线的效果。
我想画的是条形图,而不是背景。
如果你已经有了一张合适的图片。TexturePaint
可能是一种选择。有一个关于这两种技术的讨论 此处.