Re: Moving objects on GlassPane ignores setLocation()
I just tried to change the code back to the "overriding
paintComponent" approach and what the heck, it's working! After I've
spent a day trying this out, I'm doing practically the same thing and
it is working fine!
I am still curious how I could get the JLabel approach working, but at
least I don't have the pressure of a deadline on me, and so you don't
need to break your back over it to help me. For those who are
inerested, and if you don't mind the german names, I used this:
import javax.swing.*;
import java.awt.*;
import java.awt.event.AWTEventListener;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
@SuppressWarnings("serial")
public class VersteckteGlassPane extends JPanel implements
AWTEventListener {
private final JFrame vaterfenster;
private Point altePosition = new Point();
private Point aktPosition = new Point();
private BufferedImage bild;
public VersteckteGlassPane(JFrame vaterfenster) {
super(null);
this.vaterfenster = vaterfenster;
setOpaque(false);
}
public void setPosition(Point aktPosition) {
this.altePosition = this.aktPosition;
this.aktPosition = aktPosition;
}
public void setBild(BufferedImage bild){
this.bild = bild;
}
public Rectangle getRepaintBereich() {
int x = (int)aktPosition.getX();
int y = (int)aktPosition.getY();
int x2 = (int)altePosition.getX();
int y2 = (int)altePosition.getY();
int breite = bild.getWidth();
int hoehe = bild.getHeight();
return new Rectangle(x, y, breite, hoehe).union(new
Rectangle(x2, y2, breite, hoehe));
}
protected void paintComponent(Graphics g) {
if (bild == null || !isVisible()) {
return;
}
Graphics2D g2 = (Graphics2D) g.create();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
1.0f));
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int x = (int) (aktPosition.getX());
int y = (int) (aktPosition.getY());
g2.drawImage(bild, x, y, (int)bild.getWidth(),
(int)bild.getHeight(), null);
}
public void eventDispatched(AWTEvent event) {
if ((event instanceof MouseEvent) && (this.bild != null)) {
MouseEvent me = (MouseEvent) event;
Point aktPosition;
if (me.getID() != MouseEvent.MOUSE_EXITED ||
me.getComponent() != vaterfenster) {
MouseEvent converted =
SwingUtilities.convertMouseEvent(me.getComponent(), me,
vaterfenster.getGlassPane());
aktPosition = converted.getPoint();
this.setPosition(aktPosition);
this.repaint(this.getRepaintBereich());
}
}
}
public void registriere(boolean registriere) {
if(registriere){
Toolkit.getDefaultToolkit().addAWTEventListener(this,
AWTEvent.MOUSE_MOTION_EVENT_MASK |
AWTEvent.MOUSE_EVENT_MASK);
}
else{
Toolkit.getDefaultToolkit().
removeAWTEventListener(this);
}
}
}