Mouse Dragged e DrawOval [Resolvido]

7 respostas
landantas

Olá galerinha!!

Estou desenvolvendo um sistema com edição de imagens(bem básico).

Onde o cliente vai apenas fazer marcações sobre a imagem…

A parte de desenho livre(lapis) eu já fiz…
E o circulo está aparecendo porém só quando o botão do mouse é solto, pois se eu colocar no mousedragged fica uma coisa orrivel!

eu quero que de acordo com que o usuário movimento o mouse o circulo seja redimensionado, entendem?

Alguém pode me ajudar?

Desde já grato pela atenção!

Fiquem com DEUS:!:

7 Respostas

landantas

Aee Galerinha!!

Achei uma "pré-solução" akii:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Rectangle2D;

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

public class Draw2DObjects extends JPanel {
  private Rectangle2D.Float myRect = new Rectangle2D.Float(50, 50, 50, 50);

  MovingAdapter ma = new MovingAdapter();

  public Draw2DObjects() {
    addMouseMotionListener(ma);
    addMouseListener(ma);
    addMouseWheelListener(new ScaleHandler());
  }

  public void paint(Graphics g) {
    super.paint(g);

    Graphics2D g2d = (Graphics2D) g;

    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
        RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

    g2d.setColor(new Color(0, 0, 200));
    g2d.fill(myRect);
  }

  class MovingAdapter extends MouseAdapter {

    private int x;

    private int y;

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

    public void mouseDragged(MouseEvent e) {

      int dx = e.getX() - x;
      int dy = e.getY() - y;

      if (myRect.getBounds2D().contains(x, y)) {
        myRect.x += dx;
        myRect.y += dy;
        repaint();
      }
      x += dx;
      y += dy;
    }
  }

  class ScaleHandler implements MouseWheelListener {
    public void mouseWheelMoved(MouseWheelEvent e) {

      int x = e.getX();
      int y = e.getY();

      if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {

        if (myRect.getBounds2D().contains(x, y)) {
          float amount = e.getWheelRotation() * 5f;
          myRect.width += amount;
          myRect.height += amount;
          repaint();
        }
      }
    }
  }

  public static void main(String[] args) {
    JFrame frame = new JFrame("Moving and Scaling");
    Draw2DObjects m = new Draw2DObjects();
    m.setDoubleBuffered(true);
    frame.add(m);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 300);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

Mas aii ele desenha um quadrado e eu queria um oval.

Alguém tem a solução??

Desde já grato pela atenção:!:

InicianteJavaHenriqu

Olá landantas

Deve existir vários exemplos de editores de imagem aqui no JTextField de pesquisa do GUJ :wink:

Recentemente o usuário Wesllen fez um paint, você pode adaptar o projeto dele e usar no seu projeto :smiley: isto aqui também pode ajudar :arrow: http://www.guj.com.br/java/260550-recortar-imagem-circularmente#

flw

landantas

Henrique Obrigado pela atenção!

Mas eu acabei de desenrolar aki…

Eu estou criando um Array de Arcos pré-definidos(altura 0, largura 0, x = 0,…).

E de acordo com que o cliente vai “Draggando” o mouse as definições do arco vão sendo alteradas…

Mas desde já obrigado pela atenção de Todos.

Fiquem com DEUS:!:

landantas

Segue o Código Caso alguém esteja com este mesmo problema:

Arc2D.Float circulos[] = new Arc2D.Float[30];//Cria uma Array dos arcos
    Color cores[] = new Color[30];//Cria uma Array com as cores dos arcos
    int forma = 0;//indica qual o arco atual
    ...
    for (int i = 0; i < circulos.length; i++) {
         circulos[i] = new Arc2D.Float(Arc2D.OPEN);//Define os arcos
         circulos[i].setAngleExtent(360);//Define a quantidade de graus que os arcos terão
         circulos[i].setAngleStart(0);//Define em que angulo o arco irá começar a ser desenhado
         cores[i] = Color.black;//Define todas as cores como Preta
    }
    ...
    public void paint(Graphics g) {//Sempre que for alterado a gráfica do componente
        Graphics2D g2d = (Graphics2D) g;
        g2d.setStroke(new BasicStroke(3));//Seta largura da linha dos circulos
        for (int i = 0; i < circulos.length; i++) {
            g2d.setColor(cores[i]);//pega a cor do Array
            g2d.draw(circulos[i]);//Desenha a Borda dos Arcos
        }
    }
    ...
    public void mousePressed(MouseEvent evt) {//quando o mouse for pressionado
            xx = evt.getX();//pega a posição x do mouse
            yy = evt.getY();//pega a posição y do mouse
            cores[forma] = cor;//Seta a cor do arco atual
    }
    public void mouseReleased(MouseEvent evt) {//Quando o botão do mouse for solto
        forma++;//incrementa a forma
    }
    ....
    public void mouseDragged(MouseEvent evt) {//Agora Quando o mouse for "dragado"
            xx1 = evt.getX();//pega o lugar x atual do mouse
            yy1 = evt.getY();//pega o lugar y atual do mouse
            if(xx1>xx){
                    if(yy1>yy){
                        circulos[forma].setFrame(xx, yy, xx1-xx, yy1-yy);//Desenha o arco
                        repaint();//Atualiza a tela
                    }else{
                        circulos[forma].setFrame(xx, yy1, xx1-xx, yy-yy1);//Desenha o arco
                        repaint();//Atualiza a tela
                    }
                }else{
                    if(yy1>yy){
                        circulos[forma].setFrame(xx1, yy, xx-xx1, yy1-yy);//Desenha o arco
                        repaint();//Atualiza a tela
                    }else{
                        circulos[forma].setFrame(xx1, yy1, xx-xx1, yy-yy1);//Desenha o arco
                        repaint();//Atualiza a tela
                    }
                }
        }

Aii Galerinha!

Obrigado por ter dado atenção!!

Fiquem com DEUS:!:

InicianteJavaHenriqu

Boa :thumbup: ficou legal :smiley:

landantas

Tank’s :thumbup:

ViniGodoy

Oi.

Cuidado, é uma das regras do Swing que você não deve modificar o estado do objeto Graphics recebido como parâmetro. Fazê-lo pode causar comportamente inconsistente na pintura de suas janelas.
Além disso, você deve sobrescrever o método paintComponent do JPanel, não o método paint.

Felizmente, é bem fácil modificar o código.
Troque de paint para paintComponent e, no inicio do método faça:

@Override public void paintComponent(Graphics graphics) { Graphics2D g = (Graphics2D)graphics.create(); //Cria uma cópia de graphics //Trabalhe com a cópia g.dispose(); //Libera o contexto gráfico }

Copiar o contexto gráfico também é uma prática interessante, pois facilita muito o desenho.
Você pode criar conjuntos de funções que desenham objetos específico, sem a preocupação de como estará o Graphics após sua execução.

Criado 11 de janeiro de 2012
Ultima resposta 14 de jan. de 2012
Respostas 7
Participantes 3