Перемещение изображения мышью - Java
Формулировка задачи:
Здравствуйте. Я пытаюсь добиться перемещения изображения мышью, нашел код, который данную задачу выполняет. Но при запуске это изображение во-первых движется не точно за мышью, а лишь в ее сторону. А во-вторых при движении изображение дергается. Не могли бы вы подсказать в чем может быть проблема?
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.io.File;
public class SampleImage extends JFrame {
public SampleImage() throws HeadlessException {
setTitle("Sample Drag and Drop Image");
setSize(new Dimension(800,600));
setLayout(null);
File file = new File("mallet.png");
final JLabel label = new JLabel();
label.setBounds(10, 10, 50, 50);
label.setIcon(new ImageIcon(file.getAbsolutePath()));
add(label);
label.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
label.setLocation(e.getX(),e.getY());
}
@Override
public void mouseMoved(MouseEvent e) {
}
});
}
public static void main(String[] args) {
JFrame frame = new SampleImage();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}Решение задачи: «Перемещение изображения мышью»
textual
Листинг программы
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.*;
/**
*
* @author Nicholas White
*/
public class SampleImage extends JFrame {
public SampleImage() {
JLabel label = new JLabel(new ImageIcon("C:/Users/Пользователь/Documents/NetBeansProjects/SampleImage/build/classes/sampleimage/king_black.png"));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setContentPane(new MyPanel(label));
frame.setSize(600, 400);
frame.setVisible(true);
}
public static void main(String[] args) {
new SampleImage();
}
}
class MyPanel extends JPanel implements MouseListener, MouseMotionListener{
int prevX, prevY;
JLabel label;
public MyPanel(JLabel label) {
this.label = label;
addMouseMotionListener(this);
addMouseListener(this);
add(label);
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
prevX = label.getX() - e.getX();
prevY = label.getY() - e.getY();
Component c = e.getComponent();
if(c instanceof JLabel){
updateLocation(e);
}
}
@Override
public void mouseReleased(MouseEvent e) {
Component c = e.getComponent();
if(c instanceof JLabel){
updateLocation(e);
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
updateLocation(e);
}
@Override
public void mouseMoved(MouseEvent e) {
}
private void updateLocation(MouseEvent e) {
label.setLocation(prevX + e.getX(), prevY + e.getY());
repaint();
}
}