JFrame Glasspane ist ebenfalls über JDialog verfügbar, sollte es aber nicht

Ich habe einen JFrame (undekoriert) mit einer Glasscheibe. Dieser Frame öffnet einen JDialog (ebenfalls undekoriert und hat ebenfalls eine Glasscheibe) und versteckt sich (setVisible (false)). Die Glasscheiben werden mit .setGlassPane () gesetzt. Der Dialog wird mit dem Frame als Eigentümer geöffnet.

Die GlassPane erweitert ein JPanel und implementiert AWTEventListener. Ich benutze es, um die Größe der Frames und Dialoge zu ändern, damit es weiß, dass es übergeordnet ist (der Frame / Dialog) - dies wird "Ziel" genannt.

Die Ereignisse in der GlassPane werden wie folgt behandelt:

public void eventDispatched(AWTEvent event) {

  if (target instanceof JFrame) {
     e = SwingUtilities.convertMouseEvent(
     ((MouseEvent) event).getComponent(),
     (MouseEvent) event, ((JFrame) target).getGlassPane());
  } else if (target instanceof JDialog) {
     e = SwingUtilities.convertMouseEvent(
     ((MouseEvent) event).getComponent(),
     (MouseEvent) event, this);
  }


  if (e.getID() == MouseEvent.MOUSE_PRESSED) {
    this.startPos = target.getLocationOnScreen();
  }
}

Bei "target.getLocationOnScree" erhalte ich eine IllegalComponentStateException, wenn der JFrame ausgeblendet ist und ich auf den JDialog klicke. Es heißt "Komponente muss auf dem Bildschirm angezeigt werden, um ihren Standort zu bestimmen". Dies liegt daran, dass die Glasscheibe des JFrame das Ereignis erhält. Aber die Glasscheibe des JDialog sollte es bekommen. Ich denke, die Glasscheibe des JFrame befindet sich vor dem JDialog. Aber warum?

Danke fürs Helfen!

Bearbeiten:

Hier ist ein Beispiel:

import java.awt.AWTEvent;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;

import javax.swing.JDialog;
import javax.swing.JFrame;



public class Main {




    static JFrame frame;
static JDialog dialog;


public static void main(String[] args) {

    frame = new JFrame();
     frame.setSize(600,600);
    GlassPane frameGlas = new GlassPane(frame);
    frame.setGlassPane(frameGlas);
    frame.setVisible(true);

    frameGlas.setVisible(true);
    dialog = new JDialog(frame);

    dialog.setSize(100, 100);
    GlassPane dialogGlas = new GlassPane(dialog);

    dialog.setGlassPane(dialogGlas);
    AWTEventListener al = (AWTEventListener) frameGlas;
    Toolkit.getDefaultToolkit().addAWTEventListener(
            al,
            AWTEvent.MOUSE_MOTION_EVENT_MASK
                    | AWTEvent.MOUSE_EVENT_MASK);
    dialogGlas.setVisible(true);
    dialog.setVisible(true);
}


}


import java.awt.AWTEvent;
import java.awt.Point;
import java.awt.Window;
import java.awt.event.AWTEventListener;
import java.awt.event.MouseEvent;

import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GlassPane extends JPanel implements AWTEventListener {

    /**
     * 
     */
    private static final long serialVersionUID = 5110857185182004819L;

    private final Window target;


    public GlassPane(Window target) {
        super(null);
        this.target = target;

    }



    public void eventDispatched(AWTEvent event) {
        if (event instanceof MouseEvent) {

            MouseEvent originalEvent = (MouseEvent) event;

            MouseEvent e = originalEvent;
        if (target instanceof JDialog) {
                e = SwingUtilities.convertMouseEvent(
                        ((MouseEvent) event).getComponent(),
                        (MouseEvent) event, this);
            }


            if (e.getID() == MouseEvent.MOUSE_PRESSED) {

                Point p  = target.getLocationOnScreen();
                System.out.println(p.getX());
            }
        }

        }



}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage