Swing Frame mit GlassPane und Popup

Nejah

Mitglied
Hallo miteinander!

Ich habe folgendes vor: In einem JFrame wird ein Popup aufgerufen. Während dieses Popup geöffnet ist, sollen die Elemente im Content Pane nicht aktiviert werden können. Hierfür setze ich das Glass Pane mit den entsprechenden Event-Listenern.

Nun zum Problem: Sobald das Glass Pane auf visible gesetzt wird, sind die Elemente des Popups zwar nutzbar (mit System.out leicht zu überprüfen), jedoch werden offenbar keine Repaints mehr gemacht. Das heißt zum Beispiel für Buttons, dass sie nicht "eingedrückt" werden, wenn man auf sie klickt, oder die Inhalte von JSpinnern nicht aktualisiert werden. Auch sämtliche Hover-Events sind nicht mehr zu sehen.

Ich habe das Problem mal auf die nötigsten Zeilen heruntergebrochen, damit ihr euch selbst ein Bild machen könnt:

Java:
public class PopupGlassPaneTest
{
    public static void main(final String[] args)
    {
        // The frame
        final JFrame frame = new JFrame();
        frame.setSize(800, 600);
        frame.setLayout(new GridLayout(3, 2));

        for (int i = 0; i < 6; i++)
        {
            frame.add(new JButton("Button " + i));
        }

        frame.setVisible(true);

        // The pop-up
        final JButton testButton = new JButton("TEST");
        testButton.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(final ActionEvent e)
            {
                System.out.println("BUTTON PRESSED");
            }

        });

        final JPanel panel = new JPanel();
        panel.add(testButton);

        final Popup popup = PopupFactory.getSharedInstance().getPopup(frame, panel, frame.getX() + 75, frame.getY() + 100);
        popup.show();

        // The glass pane
        final JPanel glassPane = new PopupGlassPaneTest.GlassPane();
        glassPane.setOpaque(false);
        frame.setGlassPane(glassPane);
        glassPane.setVisible(true);
    }

    private static class GlassPane extends JPanel
    {
        @Override
        public void paintComponent(final Graphics g)
        {
            super.paintComponent(g);
            final Color ppColor = new Color(70, 70, 255, 120);
            g.setColor(ppColor);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());
        }
    }
}

Der Button "Test" spuckt hierbei das erwartete System.out aus, man sieht aber nicht, dass man ihn klickt. Hat jemand eine Idee, wieso die entsprechenden Repaints nicht mehr getriggert werden und wie ich sie wieder reinbekomme?

Überhaupt kommt mir die ganze Anzeige komisch vor. Nach meinem Verständnis müsste doch GlassPane auch über LayeredPane (enthält Popups) liegen, was hier aber nicht der Fall ist (Popup liegt über dem GlassPane). Oder vertu' ich mich da?

Ich bin mir übrigens voll bewusst, dass ein modaler Dialog sehr viel einfacher wäre. Geht aber in dem Fall leider nicht, weil soll halt so sein ;)

EDIT: Hab' nochmal schnell einen Screenshot von dem Programm hochgeladen.
 
Zuletzt bearbeitet:

Niki

Top Contributor
warum willst du eigentlich den weg über das Popup gehen? du kannst ja dein Panel direkt auf den Glasspane legen:

Java:
  JPanel glassPane = (JPanel) frame.getGlassPane();
        glassPane.setLayout(new BorderLayout());

        JPanel ownGlassPane = new GlassPane();
        ownGlassPane.setOpaque(false);

        // The glass pane
        glassPane.add(ownGlassPane, BorderLayout.CENTER);

        final JPanel panel = new JPanel();
        panel.add(testButton);    

        ownGlassPane.add(panel);

        glassPane.setVisible(true);
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Habe noch nie mit Popup gearbeiten und auch keine Erklärung warum das Eindrücken nicht zu sehen ist.
Wenn man ein JPopupMenu verwendet funktioniert es allerdings:
Java:
	final JPopupMenu popup = new JPopupMenu();
	popup.add(panel);
	popup.setLocation(frame.getX() + 75, frame.getY() + 100);
	popup.setVisible(true);

####EDIT####
Würde aber auch eher zu dem Vorschlag von Niki tendieren und das Zeugs direkt auf die GlassPane legen.
 
Zuletzt bearbeitet:

Nejah

Mitglied
Danke für die Antworten :)

Ja, mit dem setVisible kracht's halt leider :(

Von wollen kann keine Rede sein. Es ist eher ein Sollen - vorhandenes Framework nutzen und so ...

Rein über das GlassPane wäre aber auch eine überlegenswerte Idee. Muss ich mal schauen, ob das nicht hinterher doch noch zusätzliche Probleme bringt. Spontan fiele mir aber tatsächlich kein Grund ein.

Trotzdem würd's mich schon irgendwo interessieren, wo's da genau hakt. Im Netz bin ich bisher jedenfalls noch nicht fündig geworden.
 

Michael...

Top Contributor
Eine andere Alternative wäre ein modaler undekorierter Dialog. Dann könnte man sich sogar die GlassPane und das Abfangen von Benutzerinteraktionen sparen.
 

Nejah

Mitglied
Hier jedenfalls mal die Variante rein mit GlassPane, falls es jemand nachbasteln möchte ;)

Java:
public class PopupGlassPaneTest
{
    public static void main(final String[] args)
    {
        // The frame
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setLayout(new GridLayout(3, 2));

        for (int i = 0; i < 6; i++)
        {
            frame.add(new JButton("Button " + i));
        }

        frame.setVisible(true);

        // The pop-up
        final JButton testButton = new JButton("TEST");
        testButton.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(final ActionEvent e)
            {
                System.out.println("BUTTON PRESSED");
            }

        });

        final JPanel panel = new JPanel(new GridLayout(1, 1));
        panel.add(testButton);
        panel.setBorder(new EmptyBorder(3, 3, 3, 3));
        panel.setBounds(frame.getX() + 75, frame.getY() + 100, testButton.getPreferredSize().width + 6, testButton.getPreferredSize().height + 6);

        // The glass pane
        final JPanel glassPane = new GlassPane(true);
        glassPane.setLayout(null);
        glassPane.add(panel);
        glassPane.setOpaque(false);
        frame.setGlassPane(glassPane);
        glassPane.setVisible(true);
    }

    private static class GlassPane extends JPanel implements MouseMotionListener, MouseListener
    {
        private static final long serialVersionUID = 853104957924648368L;

        private final boolean     _isModal;

        public GlassPane(final boolean isModal)
        {
            this._isModal = isModal;
            this.setOpaque(false);

            if (isModal)
            {
                this.addMouseListener(this);
                this.addMouseMotionListener(this);
            }
        }

        @Override
        public void paintComponent(final Graphics g)
        {
            super.paintComponent(g);

            if (this._isModal)
            {
                final Color ppColor = new Color(70, 70, 255, 120);
                g.setColor(ppColor);
                g.fillRect(0, 0, this.getWidth(), this.getHeight());
            }
        }

        @Override
        public void mouseClicked(final MouseEvent e)
        {
        }

        @Override
        public void mousePressed(final MouseEvent e)
        {
        }

        @Override
        public void mouseReleased(final MouseEvent e)
        {
        }

        @Override
        public void mouseEntered(final MouseEvent e)
        {
        }

        @Override
        public void mouseExited(final MouseEvent e)
        {
        }

        @Override
        public void mouseDragged(final MouseEvent e)
        {
        }

        @Override
        public void mouseMoved(final MouseEvent e)
        {
        }
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fragerjava Frame inhalt komplett löschen AWT, Swing, JavaFX & SWT 4
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
Kotelettklopfer Frame ändert Farbe nicht AWT, Swing, JavaFX & SWT 12
P Swing Zufallsbilder auf Frame ausgeben AWT, Swing, JavaFX & SWT 1
D AWT Wie kann ich ein Frame von einem anderen aus beeinflussen? AWT, Swing, JavaFX & SWT 7
R 2D-Grafik Massive Frame Drops beim Benutzen von AffineTransformOp AWT, Swing, JavaFX & SWT 2
C Swing F5 Taste neu laden auf ganzen Frame AWT, Swing, JavaFX & SWT 9
J Genutzte Methoden in einen Frame einbauen AWT, Swing, JavaFX & SWT 21
H Swing Frame an andere Klassen weitergeben AWT, Swing, JavaFX & SWT 4
olfibits Swing JavaFX-Frame in JDesktopPane darstellen? AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
K Frame aus anderer Klasse schließen AWT, Swing, JavaFX & SWT 3
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
S Tastatur frame nur nur 1 mal öffnen AWT, Swing, JavaFX & SWT 1
T Swing Java-Frame bei Programmstart NICHT im Vordergrund öffnen AWT, Swing, JavaFX & SWT 2
A Programm nun in ein Frame basteln AWT, Swing, JavaFX & SWT 1
T Frame öffnet nicht AWT, Swing, JavaFX & SWT 1
A Swing GUI - Button soll Frame verändern AWT, Swing, JavaFX & SWT 4
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M Internal Frame in den vordergrund AWT, Swing, JavaFX & SWT 4
Tausendsassa Frame öffnet aber zeigt keinen Inhalt... AWT, Swing, JavaFX & SWT 10
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
D Buttons erscheinen nicht auf Frame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
M JavaFX wie kann mann sein frame mit einem Icon fersehen? AWT, Swing, JavaFX & SWT 2
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
P Frame friert ein AWT, Swing, JavaFX & SWT 6
Z Frame mit Rechteck! AWT, Swing, JavaFX & SWT 16
Messoras JWindow/Frame durch das man durchklicken kann AWT, Swing, JavaFX & SWT 5
M Swing "Frame.setResizable(false);" verschiebt Content? AWT, Swing, JavaFX & SWT 9
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
J JTable aktuallisieren über anderen Frame AWT, Swing, JavaFX & SWT 6
J JTable Zeile anklicken und neues Frame öffnen AWT, Swing, JavaFX & SWT 4
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
B JFrame immer an gleicher stelle auf anderem Frame AWT, Swing, JavaFX & SWT 5
F JAVA-EDITOR: Panel in Frame aufnehmen AWT, Swing, JavaFX & SWT 3
B Swing JMenuBar unten in der Frame setzen? AWT, Swing, JavaFX & SWT 15
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
D Buttons erscheinen nicht auf dem zweiten Frame AWT, Swing, JavaFX & SWT 4
X Swing Größe eines Fensters JFrame / Frame AWT, Swing, JavaFX & SWT 5
BRoll Frame- Video einbinden machbar? AWT, Swing, JavaFX & SWT 6
Kandum obj_JMenu.addMenuListener - variable Anzahl an JMenus / menulistenern & frame.setTitle() dynamisch AWT, Swing, JavaFX & SWT 7
B Frame always on top nur auf anderem Frame AWT, Swing, JavaFX & SWT 9
S Aufteilung von JPanels in einem Frame AWT, Swing, JavaFX & SWT 13
K Options-Frame integrieren (zum zuschalten und wegschalten wie geht man da ran? AWT, Swing, JavaFX & SWT 7
J Frame mit Button erstellen - Warum ist es nötig, Frame über Unterklasse zu erstellen? (Reg Listener) AWT, Swing, JavaFX & SWT 2
N Swing Endlosschleife blockt Frame AWT, Swing, JavaFX & SWT 11
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
N Swing Frame ungewollt transparent! AWT, Swing, JavaFX & SWT 2
J Kleines Anzeige Problem(nur blanker Frame) AWT, Swing, JavaFX & SWT 22
D Neues Frame öffnen - und dazu altes schließen AWT, Swing, JavaFX & SWT 5
Daniel_L Drop von Dateien auf Frame - welche Drop-Location? AWT, Swing, JavaFX & SWT 2
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
C LookAndFeel Frame updated nicht vollständig AWT, Swing, JavaFX & SWT 9
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
L Jbutton + jcombobox mit vorhandenen frame verknüfen AWT, Swing, JavaFX & SWT 8
J 2 Bereiche im Frame komplett nutzen - Welchen Layoutmanager? AWT, Swing, JavaFX & SWT 3
Z Swing JTextfield auf Frame AWT, Swing, JavaFX & SWT 13
L Frame Schließen und neustarten AWT, Swing, JavaFX & SWT 4
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
P Frame "always on top" und welche GUI? AWT, Swing, JavaFX & SWT 5
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
S JMenuBar Frame Abstand AWT, Swing, JavaFX & SWT 3
J Swing Frame öffnen aus Frame mit JButton AWT, Swing, JavaFX & SWT 2
X Alte Frame-Größe beim wiederholten Aufruf AWT, Swing, JavaFX & SWT 5
M erstes Frame wartet auf die Auswertung eines zweiten AWT, Swing, JavaFX & SWT 8
J Frame-Steuerelement AWT, Swing, JavaFX & SWT 2
L Swing Flackern in Frame bei erstem Klick AWT, Swing, JavaFX & SWT 19
F Hintergrundbild im Frame AWT, Swing, JavaFX & SWT 11
S Zeichnen führt zu transparentem Frame AWT, Swing, JavaFX & SWT 6
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
B Frame im Frame? AWT, Swing, JavaFX & SWT 4
C WindowListener Frame AWT, Swing, JavaFX & SWT 8
P klassenübergreifendes Frame AWT, Swing, JavaFX & SWT 6
B Text soll nich über das Frame hinausgehen AWT, Swing, JavaFX & SWT 5
J Hintergrund Label-Frame AWT, Swing, JavaFX & SWT 3
Spin JFrame/ Frame Drag and Drop AWT, Swing, JavaFX & SWT 13
S Swing Panelgröße anpassen wenn Frame maximiert wird AWT, Swing, JavaFX & SWT 2
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
A Hintergrund von einem Frame ändern AWT, Swing, JavaFX & SWT 3
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5
M Im Frame wird nur die Menüleiste erstellt und nicht die Tabelle? AWT, Swing, JavaFX & SWT 3
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
T Mehrere sich bewegende Objekte in einem Frame AWT, Swing, JavaFX & SWT 14
J "Warte Frame" AWT, Swing, JavaFX & SWT 3
K Swing JDialog aus Frame ausrufen AWT, Swing, JavaFX & SWT 2
M Swing Dynamischer Frame AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben