Recuperar cor em um JPanel

5 respostas
Luiz_Ot_io_S_F_Campo

Bem galera, a dúvida é a seguinte:

Tenho um painel que faço um desenho em cima dele (qualquer desenho), daí queria colorir somente uma parte deste (assim como no paint tem a ferramenta de preenchimento, estou simulando uma).
Porém preciso recuperar a cor de um determinado ponto, tipo: getColor(x, y), onde x e y são as cordenadas do meu JPanel. Isso é porque preciso distinguir a borda ou outra cor das demais.

Bem, a dúvida é essa: Como faço para recuperar esta cor em um determinado ponto?

Não sei se fui claro o suficiente pois é meu primeiro tópico.

Vlw

5 Respostas

R

Crie um objeto do tipo BufferedImage do tamanho do JPanel. Em seguida use BufferedImage.createGraphics() para obter um objeto de desenho Graphics2D. Então, passe o objeto Graphics2D para o método JPanel.draw() do seu JPanel(). Nesse momento, o pixel que você deseja ler estará disponível na BufferedImage. Agora é só usar BufferedImage.getRGB() para obter o valor do pixel.

Luiz_Ot_io_S_F_Campo

Muito obrigado roger_rf, mas ainda não entendi uma parte:

Supondo que meu painel seja 400 x 400 ->
BufferedImage img = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB);

Mando a referência para g ->
Graphics g = img.createGraphics();

Porém não acontece mais nada. Caso faça um g.fillRect(50, 50, 60, 60); logo após, ele não pinta o quadrado.

Será que poderia me ajudar novamente??

R

O método que citei mais abaixo serve apenas para ler os pixels do componente. Para desenhar sobre o componente, você terá de sobrescrever o método paintComponent() do componente:

http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html#paintComponent(java.awt.Graphics)
http://java.sun.com/products/jfc/tsc/articles/painting/

Luiz_Ot_io_S_F_Campo

Este método faz com que o gráfico seja colorido considerando as extremidades e o desenho que for feito (Ponto []p).
O problema é que há um estouro de pilha, mesmo colocando limitações.
Quem poder ajudar a resolver, agradeço

package computacaografica;

import java.awt.*;
import java.awt.image.BufferedImage;

/**
 *
 * @author Luiz Otávio
 */
public class BoundaryFill {

    private static final int TAMANHO_PAINEIS = 255;
    private Color corPreenche, corContorno;
    Graphics2D g2d;
    BufferedImage img = new BufferedImage(TAMANHO_PAINEIS, TAMANHO_PAINEIS,
            BufferedImage.TYPE_INT_RGB);

    public BoundaryFill(Ponto[] p, int numPontos, Color corPreenche, Color corContorno) {

        this.corPreenche = corPreenche;
        this.corContorno = corContorno;

        // cria a imagem sobre o Graphics2D        
        g2d = img.createGraphics();

        // preenche todo o quadro de branco
        g2d.setColor(Color.white);
        g2d.fillRect(0, 0, TAMANHO_PAINEIS, TAMANHO_PAINEIS);


        //preenche o gráfico com os pontos na cor do contorno
        g2d.setColor(corContorno);
        for (int i = 0; i < numPontos; i++) {
            g2d.drawLine(p[i].x, p[i].y, 2, 2);
        }

    }

    public void draw(Graphics g, int x, int y) {

        // limita ao tamanho máximo do painel
        if ((x < TAMANHO_PAINEIS && x >= 0) && (y < TAMANHO_PAINEIS && y >= 0)) {
            // recupera cor do ponto
            Color corAtual = inqurirCor(x, y);


            // conectividade 4
            if (corAtual != corContorno && corAtual != corPreenche) {

                // Colore aquele ponto com a cor que foi solicitada
                g.setColor(corPreenche);
                g.fillOval(x, y, 2, 2);

                // atualiza o graphics2D
                g2d.setColor(corPreenche);
                g2d.fillOval(x, y, 2, 2);

                draw(g, x + 1, y);
                draw(g, x - 1, y);
                draw(g, x, y + 1);
                draw(g, x, y - 1);
            }
        }

    }

    /*
     * Recupera a cor de um determinado ponto do painel
     * */
    private Color inqurirCor(int x, int y) {

        if (img.getRGB(x, y) == corPreenche.getRGB()) {
            return corPreenche;
        } else if (img.getRGB(x, y) == corContorno.getRGB()) {
            return corContorno;
        }

        return Color.WHITE;
    }
}
Luiz_Ot_io_S_F_Campo

???

Criado 15 de outubro de 2009
Ultima resposta 23 de out. de 2009
Respostas 5
Participantes 2