Desenhando com o mouse em java

9 respostas
R

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!

9 Respostas

E

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í.

R

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!

C
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

R

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…

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

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

R

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

MUITO OBRIGADO MESMO!!!

V

É 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:

R

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.

J

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

Criado 19 de março de 2011
Ultima resposta 3 de jan. de 2014
Respostas 9
Participantes 5