如何在矩形上创建和分布斜条纹?

时间:2011-08-04 03:03:38

标签: swing transparency overlay jfreechart java-2d

我希望能够使用类似于下图的JFreeChart创建条形图。

the desired result

这是一个非常基本的单色条形图,但有一个“花哨”的细节:斜条纹。我认为这可以通过将另一张图片叠加在普通条形图上来实现。这张照片与酒吧尺寸相同,有斜白色条纹和透明背景。我不太清楚如何做到这一点,因为我的GUI经验非常少,但是我发现very useful article处理了JFreeChart图形顶部的图像覆盖,所以我很确定我应该能够拉那个。

但我该如何制作斜条纹? 我看到如何分配从左下角到右上角的线条,但不是左上角和右下角的上限线条。我可以以某种方式在矩形外面绘画(并没有将它包含在图片中)吗?

编辑:经过一些搜索后,我看不出我的覆盖透明背景图像的建议是否有效,因为我找不到任何关于如何做到这一点的例子。另一方面,仅仅在矩形上绘制线条可能更容易。

2 个答案:

答案 0 :(得分:4)

使用渐变填充绘制线条

在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)
    );

Trying to paint thin lines using a gradient fill

使用图形基元绘制线条

虽然更简单但在我的情况下不起作用。更精细,但对我而言,更自然的方式是简单地在形状(矩形,圆形,......)上绘制线条。以下代码用于生成第二个图像。请注意使用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();
    }

Just painting lines on top of another shape using clip(Shape s) to limit overflow

答案 1 :(得分:2)

source codeBarChartDemo1显示了如何应用GradientPaint,但您可能希望尝试使用LinearGradientPaint来获得对角线效果。

  

我想画条,而不是背景。

如果您已有合适的图像,TexturePaint可能是另一种选择。讨论了两种技术here