[Lógica] Posição do mouse - o tamanho do desenho

Encontra-se em anexo o arquivo com que estou testando a lógica.
o codigo aonde deve estár a logica está debaixo de:

/*
 * problema para escontrar o algoritimo certo. 
 */

Eis o meu exercício inventado.
Uma tela 250x250 tem um quadrado de dimensão 50x50 na posição x:50, y:50
No programa ao clicar no quadrado e arrasta-lo… ele pega o ponto superior esquerdo do quadrado e o movejunto ao ponteiro.
(de acordo com o codigo abaixo:)

imageX = e.getX();
imageY = e.getY();

Como fazer para o quadrado se mover de acordo com o lugar aonde vc clicar!? Isto é… :
para não confundir vou explicar apenas com a posição X

se um quadrado estiver na posição : 10
ele tem tamanho: 10

o mouse ta na posição: 15 (no meio do quadrado)

ao clicar, como o codigo acima mostra… o quadrado irá para posição 15.
Mas o certo seria… ao clicar… o quadrado continuasse na posição 10 e se :
mover o mouse para a posição: 16
então o quadrado iria para a posição: 11
e seu tamanho continua: 10

Não sei se vocês entenderam o que quero dizer… Em outras palavras…

fillrect(imageX, imageY, 10, 10)

a posição inicial dele muda pra onde vc clicar.

OBS.: skeci de mencionar ha um evento tratando se o mouse está dentro do quadrado ou não. so funciona o clique se estiver dentro do quadrado.

Alguem pode me ajudar!? to quebrando a cabeça aqui no computador e na folha tem 4 horas.

Adicione um MouseMotionListener e um MouseListener.

No mouse listener, vc escuta se o botão do mouse está Pressed ou se foi Released.
No mouse motion listener vc controla a movimentação do quadrado.

[quote=ViniGodoy]Adicione um MouseMotionListener e um MouseListener.

No mouse listener, vc escuta se o botão do mouse está Pressed ou se foi Released.
No mouse motion listener vc controla a movimentação do quadrado.[/quote]
hmm… vc entendeu errado…
o evento de clicar no quadrado ja ta pronto.
meu problema eh fazer o programa entender que aonde eu clicar no quadrado eh aonde ele vai estar movendo.
O problema eh que a ponta do quadrado acompanha a seta do mouse. e eu não to sabendo colocar o quadrado acompanhar sem ser pela ponta.

Executa o codigo e clica e arrasta o quadrado que vc vai entender… :roll:
-----edit-----
a principio eu fiz o codigo com os 2 eventos… mas aí vi que não tinha necessidade. somente o mouseMotionListener resolvia.

Aguardo.

Basta subtrair do X e do Y do mouse metade do tamanho da sua imagem.

Outra coisa, nunca manipule o objeto graphics diretamente, sempre crie uma cópia dele. Ou então, o comportamento do Swing fica indefinido e você pode presenciar bugs estranhos e muito difíceis de se corrigir (eu mesmo já passei por isso).

Segue o código corrigido:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;

public class Janela extends JFrame {
    private Rectangle2D.Double quad = new Rectangle2D.Double(50, 50, 50, 50);

    public static void main(String[] args) {
        new Janela().setVisible(true);
    }

    public Janela() {
        setSize(250, 250);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MouseHandler handler = new MouseHandler();
        addMouseMotionListener(handler);
        addMouseListener(handler);
        setBackground(Color.GRAY);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setColor(Color.RED);
        g2d.draw(quad);
        g2d.dispose();
    }

    public class MouseHandler extends MouseAdapter {
        private boolean mouseDownOnQuad = false;
        @Override
        public void mousePressed(MouseEvent e) {
            mouseDownOnQuad = quad.contains(e.getPoint());
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            mouseDownOnQuad = false;
        }
        
        @Override
        public void mouseDragged(MouseEvent e) {            
            if (!mouseDownOnQuad)
                return;
            quad.x = e.getX() - (quad.width / 2.0);
            quad.y = e.getY() - (quad.height / 2.0);
            repaint();
        }
    }
}

Adicionei ao favoritos e vou testar o codigo amanhã, pois vou ter mais tempo.
Vou dar uma olha nesse Rectangle2D, pois não tenho conhecimento ainda sobre o java2D em relaçao aos métodos. Pelo que eu entendo. A posição X e Y do quadrado será sempre centralizada ao ponteiro do mouse. correto!?

Amanha dou a resposta quanto ao código.

.LG.