Objekt auf Glasspane zeichnen funktioniert nicht richtig

Hallo,

ich habe folgenden Code mal programmiert:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GlasFenster extends JFrame implements ActionListener, MouseMotionListener{

public JFrame frame;
public JPanel panel;
public JButton button;
public JLabel label;
public GlassPane glasspane;
public int xpos, ypos, höhe, breite;

public GlasFenster(){
	
	glasspane = new GlassPane();
	frame = new JFrame();
	button = new JButton("test");
	label = new JLabel();
	panel = new JPanel();
	BorderLayout borderlayout = new BorderLayout();
	
	frame.setBounds(getMaximumWindowBounds());
	frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
	frame.setLayout(borderlayout);
	
	int höhe = frame.getHeight();
	int breite = frame.getWidth();
	
	label.setBounds(280,80,200,100); // setBounds wird nur mal für diesen Versuch eingesetzt!
	label.addMouseMotionListener(this);
	
	button.setBounds(20, 20, 100, 50); // setBounds wird nur mal für diesen Versuch eingesetzt!
	button.addActionListener(this);
	
	panel.setLayout(null);
	panel.add(button);
	panel.add(label);
	
	frame.getWidth();
	frame.getHeight();
	
	glasspane.setBounds(0,0,breite,höhe);
	
	frame.add(panel, BorderLayout.CENTER);
	frame.setGlassPane(glasspane);
	
	glasspane.setVisible(true);
	frame.setVisible(true);
}

public static void main(String[] args){
	
	GlasFenster pc = new GlasFenster();
} 

// Unterklasse:

public class GlassPane extends JComponent{
	
		public void paint(Graphics g){
	    	g.setColor(Color.red);
	    	g.fillRect(xpos,ypos,50,50);  
	    } 		 
}

@Override
public void mouseDragged(MouseEvent arg0){	
}

@Override
public void mouseMoved(MouseEvent arg0){
	
	xpos = arg0.getX();
	ypos = arg0.getY();
	
	glasspane.repaint();
}

@Override
public void actionPerformed(ActionEvent event) {
	
	if(event.getSource() == this.button){
		label.setText("Es hat funktioniert!");
}
  }
private static Rectangle getMaximumWindowBounds(){
	
    GraphicsEnvironment graphicsEnvironment = 
        GraphicsEnvironment.getLocalGraphicsEnvironment();
    return graphicsEnvironment.getMaximumWindowBounds();
}
}

Leider bewegt sich das rote Quadrat nur in einem ganz kleinen Bereich.
Weiters ist es versetzt zum Mauszeiger, es sollte sich aber direkt bei der Maus befinden ohne einen Versatz.
Weiß leider nicht, was ich falsch mache?

Bitte euch um Hilfe!

SG

so ein tägliches Mini-Java-Rätsel ist ja halbwegs erfrischend, aber ist das für dich Dauerzustand?,
bisschen logisches Nachdenken reicht doch oftmals,

gelieferte xpos + ypos in Listener bei Debuggen, also simple Ausgabe, zu sehen als etwa nahe 0,0 in oberer linker Ecke des JLabels, immer relativ zur eigenen Komponente,
das JLabel verdient übrigens einen einfachen Border oder Hintergrundfarbe für Erkennung,

Zeichnung dieser Koordinaten von 0,0 an aufwärts in Position 0,0 des GlassPanes, auf der ganzen Fläche,

wenn das JLabel für den MouseListener erst bei x=280 auf in etwa dieser Fläche beginnt,
ist es da nicht von alleine als Möglichkeit zu bedenken, beim Zeichen für x 280 draufzuaddieren?
schon in der Nähe des JLabels, des Mauszeigers

1 Like

Ich glaube schon das meine Fragen berechtigt sind.
Wenn ich das alles wüsste, dann müsste ich wohl kaum nachfragen, nur mal zur Info für Dich.

Weiters glaube ich, das mein Problem nicht verstanden wurde.
Das JLabel ist nur da um Anzuzeigen, dass der Button auf den klick der Maus reagiert hat.
Ich habe ja über den Button ein GlassPane.
Für mehr ist das JLabel nicht da.

Das Rechteck sollte man über den GESAMTEN Bildschirm bewegen können und genau das funktioniert nicht. Das JFrame füllt ja auch den gesamten Monitor aus und genauso groß muss das GlassPane auch sein.

Daher habe ich gefragt, was ich Falsch gemacht habe?

Bin draufgekommen, was der Fehler war!

Ich habe den MouseMotionListener auf das JLabel gesetzt, anstatt auf das glasspane.
Da hätte ich auch selber draufkommen können, ist mir echt nicht aufgefallen.

Sorry für die Umstände.