Java-couleur opaque


J'essaie de tracer quelques lignes. Le problème concerne les couleurs. Exemple. J'ai plusieurs lignes de couleur rouge, et que je dessine une ligne de couleur bleue (ou inversé). Et parfois, cette ligne qui est plus, est opaque pour ce dernier.

J'ai essayé de créer une nouvelle couleur et de définir la couleur avec alpha composite 0.7 - pour ces autres lignes, et une couleur que j'ai laissée par défaut - opaque (alpha 1.0). Au début, je dessine plus de lignes, et que la dernière. Mais ces lignes "écrasent" celle-là. Est-il une solution pour résoudre ce problème?

Je trace ces lignes sur glasspane.


modifier: ce code est robuste, de sorte qu'il est difficile de le poster, et il est une partie de la thèse. principe est 2 couleur par exemple Couleur basicColor; Couleur similarColor;

Que j'ai la méthode paint et 2 hashmaps comme attributs - certains points sont stockés. j'itère sur cette carte, rappelez-vous qu'un point et semblable à lui, tous les autres se connectent avec graphics2D. drawLine (x1,y1,x2,y2) et que changer la couleur et la peinture durent une ligne avec une autre couleur. Je modifie aussi stroke, pour le rendre plus significatif.

J'espère que ce sera suffisant...


edit2: j'ai un point similaire à une méthode de peinture robuste et voici la modification graphique itérateur itérer sur la liste des listes de points.

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

Je l'ai écrit dans le bloc-notes donc désolé pour certaines erreurs (je pense que les crochets etc.), mais c'est un mécanisme de modification, autour duquel se trouvent d'autres méthodes pour itérer et autre, mais ce n'est pas important. Le problème avec l'AVC n'existe pas, car au début je l'ai fait sans AVC.

Merci pour toute idée.

Author: Equo, 2011-10-19

1 answers

Le résultat dépend de la règle de composition spécifiée dans le contexte graphique en utilisant setComposite(). Cet utilitaire peut être utile pour comprendre les différents modes. Il peut également vous aider à préparer un sscce qui présente le problème que vous décrivez.

Addendum: Voici un exemple qui montre comment on peut utiliser AlphaComposite.Src mode pour cela.

entrez la description de l'image ici

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);
    }
}
 10
Author: trashgod, 2017-04-03 17:27:50