Java Graphics setColor ne fonctionne pas


J'essaie d'implémenter un tracé d'un Ensemble de Julia en utilisant un Canvas dans un JFrame. Pour une raison quelconque, il semble que setColor() ne fonctionne pas. Voici le code responsable:

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

Au début, je soupçonnais que les valeurs n'étaient pas transmises correctement à m_iPixel..., donc j'ai codé en dur les valeurs à 0xff dans la fonction appelante. J'ai vérifié via r, g, b et je suis certain qu'ils sont tous ensemble à cette valeur, mais la toile est noir.

Ce qui est drôle, c'est: quand j'entre aGraphics.setColor(Color.WHITE) ou aGraphics.setColor(0xff, 0xff, 0xff) au lieu de variables r, g, b il fonctionne! Même si j'ai vérifié que les variables étaient à la même valeur et les ai codées en dur plus tôt à 0xff. Je suis complètement à court d'idées quant à ce qui pourrait être le problème...

MODIFIER:

Les valeurs ont été codées en dur comme suit:

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 a été appelé par la superclasse dans cette méthode:

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

Qui a été à son tour appelé par cette boucle.

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

J'ai vérifié que ce la boucle est définitivement terminée. J'ai vérifié à nouveau les valeurs en utilisant le débogueur juste avant setColor(). Comme je ne fais pas confiance au débogueur (par expérience), j'ai vérifié une autre fois avec la console en ajoutant System.out.println("r = " + Integer.toString(r) + " g = " + Integer.toString(g) + " b = " + Integer.toString(b)); juste avant setColor().

MODIFIER:

Ceci est ma méthode de peinture du 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);
}
Author: David Wright, 2016-03-16

1 answers

Je ne sais pas si publier de gros morceaux de code dans les commentaires a beaucoup de sens, alors voici mon code de test pour vous:

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

Et c'est la classe 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;
    }
}

J'ai essayé de rester aussi proche que possible de ce que vous avez fourni (même si votre convention de nommage n'est pas vraiment mon genre). Les principaux changements étaient dans la boucle de la méthode principale car je n'avais pas besoin de la plupart de ce code. J'ai également effacé la méthode calcColor car elle appelait simplement un différent méthode.

Quoi qu'il en soit, cela fonctionne pour moi (= je reçois une toile blanche). J'ai également essayé de changer le 0xff s en(int) (Math.random() * 255) qui se traduira par un... allons-y avec une toile de couleur arc-en-ciel, donc cela semble bien fonctionner.

 2
Author: Mr. M, 2016-03-17 09:19:30