Java - 不透明的颜色

时间:2011-10-19 15:18:01

标签: java colors drawing

我想画一些线条。问题是关于颜色。例如。我有几行红色,而且我画了一行蓝色(或反转)。有时,那些更多的线条对于最后一个线条是不透明的。

我尝试制作新的颜色并使用alpha复合材料设置颜色0.7 - 对于那些更多的线条,我保留一种颜色默认 - 不透明(alpha 1.0)。起初我绘制了更多的线条,而不是最后一条线条。但那条线“覆盖”那一条。有没有解决这个问题的解决方案?

我在玻璃窗上绘制那条线。


编辑 :该代码非常强大,因此很难发布,而且它是论文的一部分。 例如,原则是2色 Color basicColor; 颜色相似的颜色;

比我有绘画方法和2个哈希图作为属性 - 存储了一些点。 我迭代这张地图,记住一点和他相似,所有其他的连接 graphics2D.drawLine(x1,y1,x2,y2)然后改变颜色并用另一种颜色绘制最后一行。我也在修改中风,使其更显着。

我希望它足够......


EDIT2: 的 我有一些Point相似点比一些强大的绘画方法,这里是图形修改 迭代器遍历点列表列表。

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 个答案:

答案 0 :(得分:10)

结果取决于使用setComposite()在图形上下文中指定的合成规则。这个utility可能有助于理解各种模式。它还可以帮助您准备出现您所描述问题的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);
    }
}