JFrame Glasspane jest także nad JDialogiem, ale nie powinien

Mam JFrame (bez dekoracji) z Glasspane. Ta ramka otwiera JDialog (również niezdekorowany i ma również glassPane) i ukrywa się (setVisible (false)). Glasspanes są ustawione za pomocą .setGlassPane (). Okno dialogowe otwiera się z ramką jako właścicielem.

GlassPane rozszerza JPanel i implementuje AWTEventListener. Używam go do zmiany rozmiaru ramek i okien dialogowych, więc wie on, że jest rodzicem (ramka / okno dialogowe) - to się nazywa „cel”.

Wydarzenia wewnątrz GlassPane są obsługiwane w następujący sposób:

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();
  }
}

W „target.getLocationOnScree” otrzymuję IllegalComponentStateException, gdy JFrame jest ukryty i klikam JDialog. Mówi, że „komponent musi być wyświetlany na ekranie, aby określić jego lokalizację”. Dzieje się tak, ponieważ GlassPane z JFrame odbiera wydarzenie. Ale Glasspane z JDialog powinien go zdobyć. Myślę, że Glasspane JFrame jest przed JDialogiem. Ale dlaczego?

Dzięki za pomoc!

Edytować:

Oto przykład:

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());
            }
        }

        }



}

questionAnswers(1)

yourAnswerToTheQuestion