Acessar valores do click do mouse (mouse listener)

4 respostas
F

Ola. Como meu código é bem grande vou tentar simplificá-lo. Eu tenho uma classe principal que passa uma imagem para uma classe extends JFrame (InterfaceEditarPontos). Nesta classe InterfaceEditarPontos eu mando exibir uma imagem em um JFrame e sempre que houver um click de mouse na imagem acontece uma chamada a classe Listener que captura as coordenas do mouse. Tudo isso está acontecendo sem problema. O problema é que preciso pegar essas coordenadas do mouse e manda-las de volta para a classe InterfaceEditarPontos. Como as coordenadas são calculadas na classe Listener para enviá-las para a classe InterfaceEditarPontos eu preciso criar um objeto, só que a InterfaceEditarPontos utiliza uma imagem como parametro de entrada no construtor, então não da pra criar um objeto com valor null e como a classe Listener não tem acesso a imagem, não posso criar um objeto com esta imagem. Tem alguma forma de acessar o método pintarPixel dentro da classe InterfaceEditarPontos diretamente? As classes estão simplificadas abaixo. Lembrando que não tem nenhum problema no código, cada um tá fazendo o que precisa fazer, só não sei como retornar esses valores da classe Listener (e.getX() e e.getY()).

essa é a interface:
public class InterfaceEditarPontos extends JFrame{
   public InterfaceEditarPontos(BufferedImage imagem){
        
        criaComponentesJanela(); // cria os componentes da janela
        
        setSize(imagem.getWidth(),imagem.getHeight());
        this.imagem = imagem;
        
        povoaJanela();
        pack();
        
        Listener l = new Listener();
        this.addMouseListener(l);
        setVisible(true);
    }

    public void pintarPixel (int x, int y) throws IOException
    {
        int altura = imagem.getWidth();
        int largura = imagem.getHeight();
        
        int[] pixel = imagem.getRGB(0, 0, largura, altura, null, 0, largura);
        
        pixel[largura * x + y] = new Color(255, 0, 0).getRGB();
        
        imagem.setRGB(0, 0, largura, altura, pixel, 0, largura);
        ImageIO.write(imagem, "PNG", new File("c:\\pontos.png"));
    }
}
essa é alistener:
public class Listener extends MouseAdapter implements ActionListener
{
    @Override
    public void mousePressed(MouseEvent e)
    {
        int x = e.getX();
        int y = e.getY();
        //como passar x e y para o método pintarPixel?
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }  
}

Vlw!

4 Respostas

Z

Comecei a aprender java a pouco tempo e possivelmente (provavelmente) estou falando besteira, mas não custa tentar ajudar né?

Se você criar as variáveis como globais, assim

public class Listener extends MouseAdapter implements ActionListener  
{  
    int x, y;

    @Override  
    public void mousePressed(MouseEvent e)  
    {  
        x = e.getX();  
        y = e.getY();  
    }

não consegue recuperar com l.x e l.y lá no pintarPixel()?

F

znx, pra recuperar até que daria, só que como são vários clicks e a Listener eh disparada automaticamente, eu não sei onde poderia fazer a chamada das variáveis globais dentro da InterfaceEditarPontos para receber o valor sempre após o click, entendeu? Caso vc tenha uma ideia de quando fazer essa chamada sua solução pode dar certo. Se souber, diga ai que eu estou sem ideias. De qualquer modo, vlw pela resposta.

F

Pesquisando um pouco, vi que dá pra trazer uma AbstractAction para dentro da classe. O problema é que não consigo fazer a chamada do método automaticamente como fazia com a classe Listener. Alguma ideia?

public InterfaceEditarPontos(BufferedImage imagem){
        criaComponentesJanela(); // cria os componentes da janela
        
        setSize(imagem.getWidth(),imagem.getHeight());
        this.imagem = imagem;
        
        povoaJanela();
        pack();
        
        //como fazer chamada da 'AbstractAction' aqui?

        setVisible(true); // torna a janela visivel
    }

    Action mouseClick = new AbstractAction() {        
        public void actionPerformed(MouseEvent e) {
            System.out.println("Click do mouse...");
            int i = e.getX();
            int j = e.getY();
            try {
                pintarPixel(i, j);
            } catch (IOException ex) {
                Logger.getLogger(InterfaceEditarPontos.class.getName()).log(Level.SEVERE, null, ex);
            }
        @Override
        public void actionPerformed(ActionEvent e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    };
    
    public void pintarPixel (int x, int y) throws IOException
    {
        int altura = imagem.getWidth();
        int largura = imagem.getHeight();
        
        int[] pixel = imagem.getRGB(0, 0, largura, altura, null, 0, largura);        
        
        pixel[largura * x + y] = new Color(255, 0, 0).getRGB();        
        
        imagem.setRGB(0, 0, largura, altura, pixel, 0, largura);
        ImageIO.write(imagem, "PNG", new File("c:\\pontos.png"));
    }
}
F

Consegui resolver o problema sem precisas usar uma classe Listener. Ficou assim:

public InterfaceEditarPontos(BufferedImage imagem){
        criaComponentesJanela(); // cria os componentes da janela
        
        setSize(imagem.getWidth(),imagem.getHeight());
        this.imagem = imagem;
        
        povoaJanela();
        pack();
        
        this.addMouseListener(new MouseListener()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                System.out.println("X: " +e.getX() + " Y: " + e.getY());     
            }

            @Override
            public void mousePressed(MouseEvent e) {
            }

            @Override
            public void mouseReleased(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
            }

            @Override
            public void mouseExited(MouseEvent e) {
            }
        });
        
        setVisible(true); // torna a janela visivel
    }

Vlw pela ajuda, znx.

Criado 26 de abril de 2013
Ultima resposta 27 de abr. de 2013
Respostas 4
Participantes 2