Ява - непрозрачный цвет - PullRequest
       24

Ява - непрозрачный цвет

3 голосов
/ 19 октября 2011

Я пытаюсь нарисовать несколько линий. Проблема в цветах. Например. У меня есть несколько линий красного цвета, и затем я рисую одну линию синего цвета (или перевернутую). И иногда, те строки тем более непрозрачны для последнего.

Я попытался создать новый цвет и установить цвет с помощью альфа-композиции 0,7 - для этих дополнительных линий и одного цвета, который я оставил по умолчанию - непрозрачный (альфа-версия 1,0). Сначала я рисую больше линий, чем последний. Но эти строки «перезаписывают» эту. Есть какое-то решение, чтобы решить эту проблему?

Я рисую эти линии на стекле.


edit : этот код надежен, поэтому его сложно опубликовать, и это одна из частей тезиса. принцип 2 цвета например Цвет BasicColor; Цвет аналогичныйЦвет;

чем у меня есть метод рисования и 2 хеш-карты в качестве атрибутов - некоторые точки сохраняются. я перебираю эту карту, помню, что одна точка похожа на него, все остальные связаны с graphics2D.drawLine (x1, y1, x2, y2) и затем измените цвет и закрасьте последнюю одну строку другим цветом. Я тоже изменяю ход, чтобы сделать его более значимым.

Надеюсь, этого будет достаточно ...


edit2: У меня есть точка PointPoint, чем какой-то надежный метод рисования, и вот изменение графики итератор перебирает список списков точек.

Point similar = null;
Iterator<Point> secondIterator;
graphics.setColor(colorOfSimilar);
while (iterator.hasNext()) {
    Point point = iterator.next();
    if (point.equals(similarPoint)) {
        similar = similarPoint;
    } else {
        secondIterator = secondMap.get(point).iterator();
        while (secondIterator.hasNext()) {
            Point secondPoint = secondIterator.next();
            graphics2D.drawLine(point.getX(), point.getY(),
                secondPoint.getX(), secondPoint.getY());
        }
    }
}
if (similar != null) {
    secondIterator = secondMap.get(similar);
    graphics2D.setColor(hooverColor);
    graphics2D.setStroke(new BasicStroke(2.5f));
    while (secondIterator.hasNext()) {
        Point secondPoint = secondIterator.next();
        graphics2D.drawLine(similar.getX(), similar.getY(),
            secondPoint.getX(), secondPoint.getY());
    }
    graphics2D.setColor(colorOfSimilar);
    graphics2D.setStroke(new BasicStroke(1.0f));
}

я написал это в блокноте, так что извините за некоторые ошибки (я думаю, скобки и т. Д.), Но это механизм модификации, вокруг него другие методы для итерации и другие, но это не важно Проблем с инсультом не существует, потому что сначала я делал это без инсульта.

Спасибо за любую идею.

1 Ответ

10 голосов
/ 19 октября 2011

Результат зависит от того, какое правило компоновки указано в графическом контексте с использованием setComposite().Эта утилита может быть полезна для понимания различных режимов.Это также может помочь вам в подготовке sscce , в котором описана проблема, которую вы описываете.

Добавление: Вот пример, который показывает, как можно использовать режим AlphaComposite.Srcэто.

enter image description here

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

/** @see http://stackoverflow.com/questions/7823631 */
public class X extends JPanel {

    private static final int SIZE = 300;
    private static final int INSET = 64;
    private static final AlphaComposite OVER_HALF =
        AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
    private boolean src;

    public X(boolean src) {
        this.src = src;
        this.setBackground(Color.lightGray);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(SIZE, SIZE);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        Line2D line1 = new Line2D.Double(INSET, INSET,
            getWidth() - INSET, getHeight() - INSET);
        Line2D line2 = new Line2D.Double(getWidth() - INSET,
            INSET, INSET, getHeight() - INSET);
        g2.setStroke(new BasicStroke(64,
            BasicStroke.CAP_ROUND,
            BasicStroke.JOIN_BEVEL));
        g2.setComposite(OVER_HALF);
        g2.setColor(Color.red);
        g2.draw(line1);
        if (src) {
            g2.setComposite(AlphaComposite.Src);
        }
        g2.setColor(Color.blue);
        g2.draw(line2);
    }

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(1, 0));
        frame.add(new X(false));
        frame.add(new X(true));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
...