Eventos de mouse

3 respostas
D
Oi estou estudando java e gostaria de uma ajuda quero desenhar usando o mouse igual no paint do windows tenho este código que desenha retas mais estou tentando construir a função do lápis neste estilo podem me ajudar
public class JPanelDesenho extends JPanel {      
      
    private BufferedImage bufferedImage;//buffer      
    private BufferedImage bufferedReta;      
    private int x; //usado para gravar a posiçao do clike      
    private int y;      
      
    public JPanelDesenho() {      
        super(false);//bufferstrategy '2', acelera a atualizaçao da imagem      
        int width = 800;      
        int height = 600;      
        bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// cria um buffer com o tamanho      
        bufferedReta = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // auxiliar para reta      
              
        //inicializar com funddo branco      
        Graphics gi = bufferedImage.createGraphics();      
        gi.setColor(Color.WHITE); //seleciona cor de fundo      
        gi.fillRect(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());//pinta tudo com a cor selecionada    
        gi.fillOval(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());    
        gi.dispose();      
      
        Graphics gr = bufferedReta.createGraphics();      
        gr.setColor(Color.WHITE); //seleciona cor de fundo      
        gr.fillRect(0, 0, bufferedReta.getWidth(), bufferedReta.getHeight());//pinta tudo com a cor selecionada      
        gr.fillOval(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());    
        gr.dispose();      
      
        addMouseListener(new AcaoMouse());//acao de clike      
        addMouseMotionListener(new AcaoMouse());//acao de arrastar (drag)      
    }      
      
  @Override      
    public void paintComponent(Graphics g) {      
        super.paintComponent(g);      
        g.setColor(Color.WHITE); //seleciona cor de fundo      
        g.fillOval(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());    
        //g.fillRect(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());//pinta tudo com a cor selecionada      
        g.drawImage(bufferedReta, 0, 0, null);//pinta com a reta        
        g.dispose();      
    }     
      
    private class AcaoMouse implements MouseListener, MouseMotionListener {      
              
        public void mouseClicked(MouseEvent e) {      
            x = e.getX();      
            y = e.getY();      
            pinta(e.getX(), e.getY());      
            updateUI();//Atualiza a imagem do jpanel      
        }      
      
        public void mousePressed(MouseEvent e) {      
            x = e.getX();      
            y = e.getY();      
            pinta(e.getX(), e.getY());      
            updateUI();//Atualiza a imagem do jpanel      
        }      
      
        public void mouseReleased(MouseEvent e) {      
            pinta(e.getX(), e.getY());      
            Graphics gDaImagem = bufferedImage.createGraphics();//pega o g da imagem      
            gDaImagem.drawImage(bufferedReta, 0, 0, null);//desenha a reta final na imagem      
            gDaImagem.dispose();      
      
            updateUI();      
        }      
      
        public void mouseEntered(MouseEvent e) {      
        }      
      
        public void mouseExited(MouseEvent e) {      
        }      
      
        public void mouseDragged(MouseEvent e) {      
            pinta(e.getX(), e.getY());      
            updateUI();     
        }      
      
        public void mouseMoved(MouseEvent e) {      
        }      
      
        private void pinta(int mx, int my) {      
            Graphics gDaReta = bufferedReta.createGraphics();      
            gDaReta.drawImage(bufferedImage, 0, 0, null); //desenha a imagem gravada      
            gDaReta.setColor(Color.RED);//seta a cor da reta      
            //gDaReta.drawLine(x, y, mx, my);    
            gDaReta.drawOval(x, y, my, my);    
            gDaReta.dispose();      
        }      
    }      
      
    public static void main(String[] args) {      
        //Teste      
        JFrame jFrame = new JFrame();      
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
        JPanelDesenho desenho = new JPanelDesenho();      
        desenho.setPreferredSize(new Dimension(800, 600));      
        jFrame.getContentPane().add(desenho);      
        jFrame.setResizable(false);      
        jFrame.pack();      
        jFrame.setVisible(true);      
    }      
}

3 Respostas

W

Você tem que implementar o evento de arrasto do mouse (mouseDragged da classe MouseMotionListener).

Para simular a ponta de um lapis, você pode utilizar um circulo.

Segue exemplo:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class JPanelDesenho extends JPanel {      
    
    private BufferedImage bufferedImage;//buffer      
    private BufferedImage bufferedReta;      
    private int x; //usado para gravar a posiçao do clike      
    private int y;      
      
    public JPanelDesenho() {      
        super(false);//bufferstrategy '2', acelera a atualizaçao da imagem      
        int width = 800;      
        int height = 600;      
        bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// cria um buffer com o tamanho      
        bufferedReta = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // auxiliar para reta      
              
        //inicializar com funddo branco      
        Graphics gi = bufferedImage.createGraphics();      
        gi.setColor(Color.WHITE); //seleciona cor de fundo      
        gi.fillRect(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());//pinta tudo com a cor selecionada    
        gi.fillOval(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());    
        gi.dispose();      
      
        Graphics gr = bufferedReta.createGraphics();      
        gr.setColor(Color.WHITE); //seleciona cor de fundo      
        gr.fillRect(0, 0, bufferedReta.getWidth(), bufferedReta.getHeight());//pinta tudo com a cor selecionada      
        gr.fillOval(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());    
        gr.dispose();      
      
        addMouseListener(new AcaoMouse());//acao de clike      
        addMouseMotionListener(new AcaoMouse());//acao de arrastar (drag)      
    }      
      
  @Override      
    public void paintComponent(Graphics g) {      
        super.paintComponent(g);      
        g.setColor(Color.WHITE); //seleciona cor de fundo      
        g.fillOval(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());    
        //g.fillRect(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());//pinta tudo com a cor selecionada      
        g.drawImage(bufferedReta, 0, 0, null);//pinta com a reta        
        g.dispose();      
    }     
      
    private class AcaoMouse implements MouseListener, MouseMotionListener {      
              
        public void mouseClicked(MouseEvent e) {      
            x = e.getX();      
            y = e.getY();      
            pinta(e.getX(), e.getY());      
            updateUI();//Atualiza a imagem do jpanel      
        }      
      
        public void mousePressed(MouseEvent e) {      
            x = e.getX();      
            y = e.getY();      
            pinta(e.getX(), e.getY());      
            updateUI();//Atualiza a imagem do jpanel      
        }      
      
        public void mouseReleased(MouseEvent e) {
        }      
      
        public void mouseEntered(MouseEvent e) {      
        }      
      
        public void mouseExited(MouseEvent e) {      
        }      
      
        public void mouseDragged(MouseEvent e) {      
            pinta(e.getX(), e.getY());      
            updateUI();
        }      
      
        public void mouseMoved(MouseEvent e) {      
        }      
      
        private void pinta(int mx, int my) {      
            Graphics2D gDa = bufferedReta.createGraphics();
            Shape circle = new Ellipse2D.Float(mx, my, 3, 3);
            gDa.setPaint(Color.BLUE);
            gDa.draw(circle);      
            gDa.setPaint(Color.BLUE);
            gDa.fill(circle);
        }      
    }      
      
    public static void main(String[] args) {      
        //Teste      
        JFrame jFrame = new JFrame();      
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
        JPanelDesenho desenho = new JPanelDesenho();      
        desenho.setPreferredSize(new Dimension(800, 600));      
        jFrame.getContentPane().add(desenho);      
        jFrame.setResizable(false);      
        jFrame.pack();      
        jFrame.setVisible(true);      
    }      
}

wiliamps

Metaleiro

Não sei se irá ajudar, mas de qualquer forma segue:

problema com JPanel

Ataxexe

Por favor, não duplique tópicos:

http://www.guj.com.br/java/287031-eventos-de-mouse-

Se não souber em qual fórum abrir, abra no que achar conveniente. O pessoal da moderação irá movê-lo para o local adequado se for o caso.

Criado 12 de novembro de 2012
Ultima resposta 12 de nov. de 2012
Respostas 3
Participantes 4