Java Graphics setColor不起作用

时间:2016-03-16 13:32:28

标签: java swing canvas graphics awt

我正尝试在Canvas内使用JFrame来实现Julia Set的情节。出于某种原因,似乎setColor()不起作用。这是负责任的代码:

@Override
public void paint(Graphics aGraphics) 
{
    // store on screen graphics
    Graphics cScreenGraphics = aGraphics;
    // render on background image
    aGraphics = m_cBackGroundImage.getGraphics();

    for(int i = 0; i < m_iWidth; i++) 
    {
        for(int j = 0; j < m_iHeight; j++) 
        {
            int r = m_iPixelRed[i][j];
            int g = m_iPixelGreen[i][j];
            int b = m_iPixelBlue[i][j];
            aGraphics.setColor(new Color(r, g, b));
            aGraphics.drawRect(i, j, 0, 0);
        }
    }
    // rendering is done, draw background image to on screen graphics
    cScreenGraphics.drawImage(m_cBackGroundImage, 1, 1, null);
}

起初我怀疑这些值没有正确传递给m_iPixel...,因此我将值硬编码到调用函数中的0xff。我通过rgb进行了检查,并确定它们都已设置为该值,但画布为黑色。

有趣的是:当我输入aGraphics.setColor(Color.WHITE)aGraphics.setColor(0xff, 0xff, 0xff)而不是变量rgb时,它会起作用!即使我检查了变量是否处于相同的值并且早先将它们硬编码为0xff。我完全不知道可能是什么问题......

修改

这些值的硬编码如下:

public void setPixelColour(int i, int j, int r, int g, int b)
{
    m_iPixelRed[i][j] = 0xff;
    m_iPixelGreen[i][j] = 0xff;
    m_iPixelBlue[i][j] = 0xff;
}

setPixelColour由此方法中的超类调用:

private void calcColour(int i, int j, int aIterations)
{
    m_cCanvas.setPixelColour(i, j, 0XFF, 0xff, 0XFF);
}

这又是由这个循环调用的。

for(int i = 0; i < iCanvasHeight; i++){
    for(int j = 0; j < iCanvasWidth; j++){
        cSum.setRe(m_cCoordPlane[i][j].getRe());
        cSum.setIm(m_cCoordPlane[i][j].getIm());
        m_iIterations[i][j] = 0;
        do{
            m_iIterations[i][j]++;
            cSum = cSum.square();
            cSum = cSum.add(m_cSummand);
            m_dAbsSqValues[i][j] = cSum.getAbsSq();
        }while((m_iIterations[i][j] < MAXITER) && (m_dAbsSqValues[i][j] < m_iDivergThresh));
        this.calcColour(i, j, m_iIterations[i][j]);
        m_cMsgIter = "x = " + i + " , y = " + j;
        this.repaint();
    }
}

我检查确保此循环已完成。我在setColor()之前使用调试器再次检查了值。由于我不相信调试器(经验不足),我在System.out.println("r = " + Integer.toString(r) + " g = " + Integer.toString(g) + " b = " + Integer.toString(b));之前添加setColor(),在控制台上再次检查了一次。

编辑:

这是JFrame

的绘画方法
public void paint(Graphics aGraphics) 
{
    Graphics cScreenGraphics = aGraphics;
    // render on background image
    aGraphics = m_cBackGroundImage.getGraphics();

    this.paintComponents(aGraphics);
    // drawString() calls are debug code only...
    aGraphics.setColor(Color.BLACK);
    aGraphics.drawString(m_cSMsg, 10, 450);
    aGraphics.drawString(m_cMsgIter, 10, 465);
    aGraphics.drawString(m_cMsgDivThresh, 10, 480);

    // rendering is done, draw background image to on screen graphics
    cScreenGraphics.drawImage(m_cBackGroundImage, 0, 0, null);
}

1 个答案:

答案 0 :(得分:2)

不确定在评论中发布大块代码是否充分有意义,所以这里是我的测试代码:

package test;

import javax.swing.JFrame;

public class Test 
{
    public static void main(String[] args) 
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        MyCanvas canvas = new MyCanvas();
        frame.add(canvas);
        frame.pack();
        frame.setVisible(true);

        for(int i = 0; i < 800; i++)
        {
            for(int j = 0; j < 600; j++)
            {
                canvas.setPixelColour(i, j, 0XFF, 0xff, 0XFF);
                canvas.repaint();
            }
        }
    }
}

这是MyCanvas类:

package test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class MyCanvas extends java.awt.Canvas
{
    private BufferedImage m_cBackGroundImage;
    private int[][] m_iPixelRed, m_iPixelGreen, m_iPixelBlue;
    private int m_iWidth, m_iHeight;

    public MyCanvas()
    {
        setPreferredSize(new Dimension(800, 600));
        m_iWidth = 800;
        m_iHeight = 600;
        m_cBackGroundImage = new BufferedImage(m_iWidth, m_iHeight, BufferedImage.TYPE_INT_ARGB);     
        m_iPixelRed = new int[m_iWidth][m_iHeight];
        m_iPixelGreen = new int[m_iWidth][m_iHeight];
        m_iPixelBlue = new int[m_iWidth][m_iHeight];
    }

    public void paint(Graphics aGraphics) 
    {
        Graphics cScreenGraphics = aGraphics;

        aGraphics = m_cBackGroundImage.getGraphics();

        for(int i = 0; i < m_iWidth; i++) 
        {
            for(int j = 0; j < m_iHeight; j++) 
            {
                int r = m_iPixelRed[i][j];
                int g = m_iPixelGreen[i][j];
                int b = m_iPixelBlue[i][j];
                aGraphics.setColor(new Color(r, g, b));
                aGraphics.drawRect(i, j, 0, 0);
            }
        }

        cScreenGraphics.drawImage(m_cBackGroundImage, 1, 1, null);
    }

    public void setPixelColour(int i, int j, int r, int g, int b)
    {
        m_iPixelRed[i][j] = r;
        m_iPixelGreen[i][j] = g;
        m_iPixelBlue[i][j] = b;
    }
}

我尽量保持尽可能接近你所提供的东西(即使你的命名惯例不是我的那种东西)。主要方法的主要变化是循环,因为我不需要大部分代码。我也删除了calcColor方法,因为它只是调用了一种不同的方法。

无论如何,这适合我(=我得到一块白色帆布)。我也尝试将0xff更改为(int)(Math.random()* 255),这将导致...让我们使用彩虹色画布,因此它似乎工作正常。