1

我有一个垂直颜色条,它有 7 种主要颜色全部组合为渐变。然后我把它画成JPanel这样:

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g;
    int w = getWidth();
    int h = getHeight();

    Point2D start = new Point2D.Float(0, 0);
    Point2D end = new Point2D.Float(0, h);
    float[] dist = {
        0.02f,
        0.28f,
        0.42f,
        0.56f,
        0.70f,
        0.84f,
        1.0f
    };

    Color[] colors = {
        Color.red,
        Color.magenta,
        Color.blue,
        Color.cyan,
        Color.green,
        Color.yellow,
        Color.red
    };

    LinearGradientPaint p = new LinearGradientPaint(start, end, dist, colors);

    g2d.setPaint(p);
    g2d.fillRect(0, 0, w, h);
}

然后我在同一个类中有一个单击事件,如下所示:

public void mouseClick(MouseEvent evt){
    BufferedImage img = (BufferedImage)this.createImage(getWidth(), getHeight());
    int[] colors = new int[3];
    int x = evt.getX();
    int y = evt.getY();
    img.getRaster().getPixel(evt.getX(), evt.getY(), colors);
    ColorPickerDialog.sldColor = new Color(colors[0], colors[1], colors[2]);
    getParent().invalidate();
    getParent().repaint();
}

该行img.getRaster().getPixel(evt.getX(), evt.getY(), colors);始终返回 RGB 颜色:

  • 240
  • 240
  • 240

我可以点击任何地方,红色、黄色、绿色、青色等,我总是能恢复那些 RGB 颜色。为什么?

4

2 回答 2

3

我想我看到了问题。线

img.getRaster().getPixel(evt.getX(), evt.getY(), colors);

返回对应于 RGB 颜色的 int[]。getPixel 方法将您的数组作为参数接收,但它返回自己的数组。它从未真正触及您的阵列。你想做的是这个。

int[] colors = img.getRaster().getPixel(evt.getX(), evt.getY(), new int[3]);

这应该将方法的返回值存储在您的数组中,而不是默认值。

于 2012-12-08T00:38:47.507 回答
0

我得到了它!

我替换了这一行:

BufferedImage img = (BufferedImage)this.createImage(getWidth(), getHeight());

有了这个:

BufferedImage img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
this.paint(g);

And now it works perfectly!

于 2012-12-08T18:51:18.843 回答