Eventos de mouse

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

[code]

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

} [/code]

O pulo-do-gato está no método pinta(), ele está com o código relativo à função que vc quer. Cabe a vc identificar a função selecionada no seu programa e executar um código de pintura diferente para círculos, retas, etc.

[code]import java.awt.;
import java.awt.image.
;
import java.awt.event.;
import javax.swing.
;

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 extends MouseAdapter {      
          
    public void mousePressed(MouseEvent e) {      
        x = e.getX();      
        y = e.getY();      
        pinta(e.getX(), e.getY());      
        updateUI();//Atualiza a imagem do jpanel      
    }      
  
    public void mouseDragged(MouseEvent e) {   
        pinta(e.getX(), e.getY());      
        updateUI();     
    }      
  
    private void pinta(int mx, int my) {      
        Graphics gDaReta = bufferedReta.createGraphics();      
        gDaReta.setColor(Color.RED);//seta a cor da reta      
        gDaReta.drawLine(x, y, mx, my);    
        x = mx;
        y = 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);      
}      

}
[/code]

Obrigado ajudou bastante :smiley: :smiley: :smiley:

agora eu estou tentando abrir um arquivo
e colocar esta mesma neste mesmo JFrame
mais a imagem não aparece
pode me ajudar? :?: :?:

 import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class AbrirArquivo  implements ActionListener {

    String nomeArquivo;
    JFileChooser selecionado;
    int resultado;
    File arquivo;
    BufferedImage AbrirImagem;
    JLabel aux;

    public AbrirArquivo() 
    {
        aux = new JLabel();
        nomeArquivo = "";
        selecionado = new JFileChooser();
        resultado = 0;
        AbrirImagem= new BufferedImage(900, 900, BufferedImage.TYPE_INT_RGB);// cria um buffer com o tamanho 

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        selecionado.setDialogTitle("Selecionar a imagem");//titulo caixa 
        resultado = selecionado.showOpenDialog(null);//resulado recebe um valor inteiro
        if (resultado == selecionado.APPROVE_OPTION) //se  abrir 
        {
            arquivo = selecionado.getSelectedFile();
            nomeArquivo = selecionado.getName(arquivo);  
            try
            {
               AbrirImagem = ImageIO.read(arquivo);
               
              Graphics gImagem  =   AbrirImagem.createGraphics();//pega o g da imagem  
              gImagem.drawImage( AbrirImagem  , 0, 0, null);//desenha a reta final na imagem  
               
  
            } catch (IOException ex) {
                Logger.getLogger(AbrirArquivo.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else// se não abrir 
        {
            JOptionPane.showMessageDialog(selecionado, "Nenhuma imagem selecionada ", " Atenção", 2);
        }

    }
}