Desenhando com o mouse em java

Boa noite,
Encontrei uma aula no youtube parecido com o q procuro, a unica diferença é q tenho q desenhar com o mouse… No exemplo o desenho é fixo e no meu caso tem q ser desenhado pelo usuario podendo apagar alguma linha caso saia errada.
Sera q alguem consegue me ajudar??

Obrigado!

Cara, até posso te ajudar, mas precisamos do código que tu fez até agora pra vermos até onde tu conseguiu.

Caso ainda não tenha começado, recomendo pesquisar as interfaces Mouse Listenner e MouseMovedListenner. Qualquer coisa tamos aí.

Olá!

Este é o código que eu desenvolvi. O Que falta fazer nele é que quando arrastamos o mouse pra desenhar a linha, ela não parece… Só depois que solta o mouse que a linha é desenhada. Tem idéia de como posso fazer isso?!

 import java.awt.*;  
 import java.awt.event.*;  
 import javax.swing.*;
 import java.util.Scanner;

 public class DesenhoRetas extends JPanel implements MouseListener{
	
	private int x1, y1, x2, y2, tamanhoParede;
	

	public DesenhoRetas(){
	
	setSize(900,650);
   	this.addMouseListener(this);
     	setVisible(true);
    }
    
      
    public void paint(Graphics g,int x1,int y1,int x2,int y2){  
	g.drawLine(x1, y1, x2, y2);    
    	g.setColor(Color.BLACK);
    	
    }

    public void mouseClicked(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }  
   
    public void mouseExited(MouseEvent e) {
    }  
   
    public void mousePressed(MouseEvent e) {
    	x1 = (int) e.getX();  
        y1 = (int) e.getY(); 	 
    }  
   
    public void mouseReleased(MouseEvent e) {
    	x2 = (int) e.getX();  
        y2 = (int) e.getY();  
           
        Graphics g = getGraphics();  
        paint(g,x1,y1,x2,y2);
    }  
   
 public static void main(String args[]){  
    DesenhoRetas app = new DesenhoRetas();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }  
 }

MUITO OBRIGADO!


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
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.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.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.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.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);
    }
}

mais informaçoes
http://www.guj.com.br/java/236734-desenhar-no-jpanel-quando-clicar#1219572

VALEU CHRONOS!!! PERFEITO!!!

SÓ MAIS UMA COISA, VC SABE COMO EU FAÇO PARA AO INVÉS DE POR UM FUNDO DE COR BRANCA, POR UMA IMAGEM?!

JÁ TESTEI VÁRIAS COISAS E NADA TÁ DANDO CERTO…

[code]package guj;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class JPanelDesenho extends JPanel {

private BufferedImage bufferedImage;//buffer
private BufferedImage bufferedReta;
private BufferedImage fundo;
private int x;
private int y;

public JPanelDesenho() {
    super(true);//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 caso de erro ao carregar o arquivo
    Graphics2D 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
    //cria uma janela para carregar a imagem
    JFileChooser fileChooser = new JFileChooser();
    fileChooser.showOpenDialog(null);
    //pega o arquivo
    File arquivo = fileChooser.getSelectedFile();//arquivo, vc pode colocar "new File("c:/pasta/imagem.jpg");"
    try {
        fundo = ImageIO.read(arquivo); //carrega a imagem no buffer

        //compacta a imagem (opcional)
        AffineTransform at = AffineTransform.getScaleInstance((double) 800 / fundo.getWidth(), (double) 600 / fundo.getHeight());//cria a transformacao
        gi.drawRenderedImage(fundo, at);//pinta e transforma a imagem real no bufferedImage

        //vc pode substituir o codigo acima de transformacao pelo codigo abaixo
        //gi.drawImage(bufferedImage, 0, 0, null);

    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, "Erro ao carregar a imagem");

    }
    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.drawImage(bufferedImage, 0, 0, null);
    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.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.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]

so muda o construtor (da linha 28 a 70) e mais um atributo na classe para guardar o fundo

MUITO OBRIGADO!!! VC N~]AO SABE O QUANTO JÁ ME AJUDOU, CHRONOS!!!

MUITO OBRIGADO MESMO!!!

É um pouco antigo, mas algumas observações sobre a implementação do chronos:

  1. O Swing implementa Double Buffering por default. Não é necessário controlar em 2 BufferedImages. Ainda que você queira gerenciar os buffers manualmente, o ideal é usar a classe BufferStrategy;
  2. A estratégia de double buffering não acelera nada. O que ela faz é evitar o flickering ao evitar que uma imagem parcialmente desenhada seja pintada na tela;
  3. No lugar de updateUi(), chame invalidate() e repaint(), ou simplesmente, revalidate(). O updateUI() é mais radical, e tentará atualizar também o look&feel da tela inteira, causando uma atualização mais lenta.

No mais, o código está perfeito. Tem ótimas práticas como criar cópias dos contextos gráficos e dispo-las com o dispose(). Sem falar que o resto da implementação está certinha. :slight_smile:

Valeu pelas dicas Vini, principalmente a do updateUi… Meu computador tá com pouco memória pra vídeo, então essa dica realmente deixou o desenho mais ágil!

Abçs.

Olá

é Possivel ter um método apaga() ?
Seria o seguinte após desenhar com o mouse eu chamaria um método apagar ou limpar através de um evento de button, e poderia começar outro desenho.

como seria o método apaga para o exemplo acima ?

sds

j.silvestre