Как создать и распределить диагональные полосы на прямоугольнике? - PullRequest
3 голосов
/ 04 августа 2011

Я хотел бы иметь возможность создавать гистограммы с помощью JFreeChart, которая выглядит как на следующем рисунке.

the desired result

Это очень простая однотонная гистограмма, нос одной «причудливой» деталью: диагональные полосы.Я думал, что это можно сделать, наложив другую картинку поверх обычной панели.Эта картинка будет иметь те же размеры, что и полоса, иметь диагональные белые полосы и прозрачный фон.Я не совсем уверен, как это сделать, поскольку у меня очень мало опыта работы с графическим интерфейсом, но я нашел очень полезную статью , которая касается наложения изображений поверх графики из JFreeChart, поэтому я вполне уверен, что ядолжен быть в состоянии вытащить это из.

Но как мне создать диагональные полосы?Я вижу, как я мог бы распределить линии из нижнего левого угла в верхний правый угол, но не ограниченные линии в верхнем левом и нижнем правом углу.Можно ли как-нибудь нарисовать за пределами прямоугольника (и не включить его в рисунок)?

edit : После некоторых поисков я не вижу, что мое предложение наложить изображение на прозрачный фонработать, так как я не могу найти примеры того, как это сделать.С другой стороны, просто нарисовать линии на прямоугольнике, вероятно, проще.

Ответы [ 2 ]

4 голосов
/ 23 августа 2011

Использование градиентной заливки для рисования линий

На кончике 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

2 голосов
/ 04 августа 2011

Исходный код для BarChartDemo1 показывает, как применить GradientPaint, но вы можете поэкспериментировать с LinearGradientPaint чтобы получить эффект диагонали.

Я хочу рисовать столбики, а не фон.

Если у вас уже есть подходящее изображение, TexturePaint может быть альтернативой. Здесь обсуждается обе техники здесь .

...