Evento de mouse em áreas pintadas de JPanel

2 respostas
antonioni.rocha

Tenho um JPanel onde uso a classe Graphics para desenhar trapézios, retângulos e várias outras formas (como polígonos, com a classe Polygon) num JPanel. Por exemplo, se eu desenho um retângulo verde qualquer neste JPanel, como posso tratar eventos quando o usuário clicar somente nesta área verde limitada? (Caso o usuário clique fora desta área, no JPanel, nada deve acontecer).

Estou precisando desenhar várias formas num mesmo JPanel (trapézios, ovais, retângulos, etc), e gostaria de tratar eventos somente nestas áreas.
Há como? :-o

2 Respostas

hvidal

Oi Antonioni,

Talvez uma forma rápida e fácil de fazer isso seja manter uma imagem em memória com o desenho do seu painel, permitindo que a gente possa pegar a cor de um determinado ponto qualquer e, portanto, descobrir se ali existe um dos desenhos.

public class PainelDesenho extends JPanel {

    private BufferedImage imagem = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
    
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        super.paintComponent(imagem.getGraphics());
    }

    public int getCorNoPonto(int x, int y) {
        return imagem.getRGB(x, y);
    }

    // Implementar o mouse listener...
}
O problema é que você vai ter que manter o tamanho da imagem igual ao tamanho do painel. Assim, quando o usuário redimensionar a janela, você terá que recriar a imagem. Eu não implementei isso no código acima.

Vale lembrar que essa solução também gastará mais memória e processamento.

Outra solução seria criar funções que avaliam se um determinado ponto está sobre uma das formas. Nesse caso, você precisaria manter objetos das formas em uma lista e percorrê-los na hora de pintar e na hora de procurar. Esse é o princípio usado pelas ferramentas de diagramação.

Grande abraço,
Hugo.

antonioni.rocha

Olá, camarada hvidal,
deu certo, usei a segunda solução (conjunto de Polygons) :D.

Agradeço…! :wink:


Criado 15 de outubro de 2006
Ultima resposta 16 de out. de 2006
Respostas 2
Participantes 2