Olá ! A minha dúvida é :
**–>Eu tenho uma lblNewLabel onde é ela tem uma imagem :
–>Também consigo mover essa imagem através do mouse.Porém, quando pressiono e seguro a seta na imagem , ela vai para o centro da imagem. O que quero é que a seta não vá para o centro , e sim que a seta fique onde eu pressionar. O código principal é
lblNewLabel = new JLabel("");
lblNewLabel.setBounds(0, 11, lblImagem.getWidth(),lblImagem.getHeight());
lblNewLabel.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
lblNewLabel.setLocation(lblNewLabel.getLocation().x + e.getX() - lblNewLabel.getWidth()/2,
lblNewLabel.getLocation().y + e.getY()-lblNewLabel.getHeight()/2);
}
});
Algém poderia me dizer o código ou explicar o que eu deveria fazer?
Vc precisa compensar a diferença da coordenada onde pressionou o mouse. Veja esse exemplo:
/**
*
* @author David
*/
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
*
* @author David
*/
public class Janela extends JFrame {
private JLabel lbl;
private int xPressed;
private int yPressed;
public Janela() {
setDefaultCloseOperation( EXIT_ON_CLOSE );
setSize( 500, 500 );
setLocationRelativeTo( null );
setLayout( null );
lbl = new JLabel( new DummyImage() );
add( lbl );
Dimension size = lbl.getPreferredSize();
lbl.setBounds( 10,
10,
size.width,
size.height );
lbl.addMouseListener( new MouseAdapter() {
@Override
public void mousePressed( MouseEvent e ) {
xPressed = e.getX();
yPressed = e.getY();
}
});
lbl.addMouseMotionListener( new MouseAdapter() {
@Override
public void mouseDragged( MouseEvent e ) {
Point p = lbl.getLocation();
lbl.setLocation(
p.x + e.getX() - xPressed,
p.y + e.getY() - yPressed );
}
} );
}
private class DummyImage extends ImageIcon {
BufferedImage img;
int largura = 200;
int altura = 200;
public DummyImage() {
img = new BufferedImage( largura, altura, BufferedImage.TYPE_INT_ARGB );
Graphics g = img.getGraphics().create();
g.setColor( new Color( 100, 100, 100 ) );
g.fillRect( 0, 0, largura, altura );
g.dispose();
}
@Override
public synchronized void paintIcon( Component c, Graphics g, int x, int y ) {
g.drawImage( img, 0, 0, null );
}
@Override
public int getIconWidth() {
return largura;
}
@Override
public int getIconHeight() {
return altura;
}
@Override
public Image getImage() {
return img;
}
}
public static void main( String[] args ) {
EventQueue.invokeLater( new Runnable() {
public void run() {
new Janela().setVisible( true );
}
} );
}
}
Eu particularmente prefiro implementar toda a infraestrutura para desenho de imagem dentro de um painel e controlar tudo por uma classe de desenho, mas do jeito que vc está fazendo acredito que vá resolver…
Vou tentar aqui e depois te respondo!