Re: Pick up and drop with image moving with the mouse
There might even be a quite different approach in creating a JLabel
from the image, putting it on the GlassPane and moving it around via
setLocation(). That way, I don't even have to bother with overriding
the paint methods. Putting it directly on the contentPane creates
weird-looking results thanks to the LayoutManagers. This now has the
problem that the GlassPane somehow catches the MouseEvents the other
Components need, even if it's disabled.
I have prepared a sample code replicating the problem. The goal is
that the listener registered on the JPanel fires, i. e. displays the
line "Received mouse event!".
Please keep in mind that my original program consists of multiple
JPanels, each containing other panels. So if I have to redirect the
event manually to each component would result in a truckload of code
that's very hard to service.
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class PickUpAndDrop extends JFrame{
// Use Singleton design pattern to provide easy access of the
relevant object
// to the listeners
private static PickUpAndDrop instance = new PickUpAndDrop();
// The label to be moved around
JLabel label;
private PickUpAndDrop(){
this.setSize(200, 200);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// Create a panel on the ContentPane that will react to user input
JPanel listenerPanel = new JPanel();
listenerPanel.addMouseListener(this.createListener());
this.add(listenerPanel);
// Create a JLabel to be moved around on the GlassPane
java.net.URL url = this.getClass().getResource("image.png");
ImageIcon image = new ImageIcon(url);
this.label = new JLabel(image);
// Get the GlassPane and prepare it for display
JPanel glasspane = (JPanel)this.getGlassPane();
glasspane.setVisible(true);
glasspane.setEnabled(false);
glasspane.setOpaque(false);
glasspane.addMouseMotionListener(this.createMotionListener());
// Put the label on the GlassPane
glasspane.add(this.label);
}
// Move the label around
protected void moveLabel(Point position){
this.label.setLocation(position);
}
// Create a listener for giving out a printline
// once the listener receives an event
private MouseAdapter createListener(){
MouseAdapter listener = new MouseAdapter(){
public void mouseClicked(MouseEvent event) {
System.out.println("Received mouse event!");
}
};
return listener;
}
// Create a listener that orders the label to be moved
// to the position of the cursor
private MouseMotionAdapter createMotionListener(){
MouseMotionAdapter listener = new MouseMotionAdapter(){
public void mouseMoved(MouseEvent event) {
Point aktPosition = event.getPoint();
PickUpAndDrop.instance.moveLabel(aktPosition);
}
};
return listener;
}
public static void main(String[] args){
PickUpAndDrop frame = PickUpAndDrop.instance;
frame.setVisible(true);
}
}