Unter JPanel liegende Komponenten "totschalten"

T

tuxedo

Gast
Hallo zusammen,

wieder mal eine Design-Frage an die Swing-Experten:

Ich habe eine Anwendung welche wahlweise im Fullscreen, als auch im Fenster läuft. Es gibt keine Dialoge oder sonstiges. Läuft alles in einem Fenster.

Wenn die Anwendung jetzt mit etwss beschäftigt ist (z.B. DB initiell befüllen, Dateien lesen, ...), dann möchte ich über das bestehende UI ein halbtransparentes Panel legen, welches eine Ladeanimation, sowie einen Hinweistext anzeigt.

Das Panel hab ich schon. Die halbtransparenz, sowie die Ladeanimation hab ich auch. Passt alles.

In meinem JFrame arbeite ich mit dem Borderlayout. Die eigentliche Anwendung läuft vollständig in einem eigenen Panel (max. Fenstergröße) und liegt in
Code:
Borderlayout.CENTER
. Parallel dazu hab ich nun mein "LoadingPanel", welches ebenfalls im Zentrum des Layout's des Frames liegt:
Java:
            contentPane.setLayout(new BorderLayout());
            contentPane.add(loadingPanel, BorderLayout.CENTER);
            contentPane.add(mainPanel, BorderLayout.CENTER);
            pack();

Soweit so gut.

Wenn das LoadingPanel nicht gebraucht wird, wird es invisible geschalten. Wird es gebraucht, wird es einfach sichtbar gemacht.

Das Problem ist jetzt: Beide Panels liegen an der gleichen Stelle und konkurrieren untereinander. Bewege ich die Maus über einen Button im mainPanel, dann blitzt der Button hervor und überzeichnet das loadingPanel...

Gibt's eine einfache Möglichkeit ein Panel, sowie alle "Child-Components" komplett tot zu stellen, ohne deren eigenen Eigenschaften (focusable/visible/...) nachhaltig zu verändern? Könnte über alle Components des mainPanels iterieren und überall "focusable" etc. abschalten. Aber beim zurückstellen müsste ich mir ja vorher noch gemerkt haben wie der "zuvor" Zustand war um diesen wiederherzustellen. Gibt's nicht was einfaches?

- Alex
 

Volvagia

Top Contributor
Für sowas kannst du das GlassPane des Fensters verwenden. Darauf das Lade-Panel legen. Das catcht automatisch die Events.

Java:
import java.awt.Color;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GlassPaneExample {
	private JFrame glassPaneFrame;
	
	public GlassPaneExample() {
		createGlassPaneFrame();
		createGlassPaneControllFrame();
	}
	private void createGlassPaneControllFrame() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.add(new JButton(new AbstractAction("Show/Hide glass pane") {
			public void actionPerformed(ActionEvent e) {
				glassPaneFrame.getGlassPane().setVisible(!glassPaneFrame.getGlassPane().isVisible());
			}
		}));
		
		frame.pack();
		frame.setVisible(true);
	}
	private void createGlassPaneFrame() {
		glassPaneFrame = new JFrame();
		glassPaneFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		glassPaneFrame.add(new JButton("Some"));
		
		JPanel glassPane = new JPanel();
		
		glassPane.setBackground(new Color(255, 0, 0, 127));
		glassPaneFrame.setGlassPane(glassPane);
		
		glassPaneFrame.pack();
		glassPaneFrame.setLocationRelativeTo(null);
		glassPaneFrame.setVisible(true);
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new GlassPaneExample();				
			}
		});
	}
}
 
T

tuxedo

Gast
Okay, das mit kom konkurrierenden Zeichnen hat sich damit erledigt. Aber die Events werden nicht abgefangen:

Java:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GlassPaneExample {

    private JFrame glassPaneFrame;

    public GlassPaneExample() {
        createGlassPaneFrame();
        createGlassPaneControllFrame();
    }

    private void createGlassPaneControllFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(new JButton(new AbstractAction("Show/Hide glass pane") {

            public void actionPerformed(ActionEvent e) {
                glassPaneFrame.getGlassPane().setVisible(!glassPaneFrame.getGlassPane().isVisible());
            }
        }));

        frame.pack();
        frame.setVisible(true);
    }

    private void createGlassPaneFrame() {
        glassPaneFrame = new JFrame();
        glassPaneFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton button = new JButton("Some");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("clicked!");
            }
        });
        
        glassPaneFrame.add(button);

        JPanel glassPane = new JPanel();

        glassPane.setBackground(new Color(255, 0, 0, 127));
        glassPaneFrame.setGlassPane(glassPane);

        glassPaneFrame.pack();
        glassPaneFrame.setLocationRelativeTo(null);
        glassPaneFrame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                new GlassPaneExample();
            }
        });
    }
}

Man kann den Button klicken wenn die GlassPane sichtbar ist.... Auf der Console erscheint "clicked!" ..

Hir steht aber dass das nicht gehen soll: How to Use Root Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

Verwende Oracle java 1.7.0_01 64bit unter Debian Linux 6 amd64 ... Mach ich was falsch?
 
Zuletzt bearbeitet von einem Moderator:

Volvagia

Top Contributor
Sry, mein Fehler. Durch die Farbe sah es so aus, als würden Events abgefangen werden. Wenn du am GlassPane einen MouseListener registrierst, sollte es richtig funktionieren:

Java:
glassPane.addMouseListener(new MouseAdapter() {});
 
T

tuxedo

Gast
Ah, okay. Jetzt geht's. Muss man auch erstmal wissen dass man, wenn man keinen MouseListener registriert, per default alle Events durchgereicht werden. Hätte jetzt erwartet dass man, wenn eine GlassPane gesetzt ist, sich selbst um's durchreichen kümmern muss.

- Alex
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JMenu unter JPanel versteckt AWT, Swing, JavaFX & SWT 5
L JPanel mit Objekten selektieren wie unter Windows / Ubuntu AWT, Swing, JavaFX & SWT 4
lolkind unter JPanel eine JTable auf voller Größe anzeigen lassen? AWT, Swing, JavaFX & SWT 6
MiMa JavaFX JAR unter Windows ausführen schlägt fehl? AWT, Swing, JavaFX & SWT 5
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
U Wie funktioniert das rotieren unter 2dGraphics, also wie stelle ich z. B. 90° ein? AWT, Swing, JavaFX & SWT 1
T Swing DPI-Skalierung und Java 2D unter Java 11 (und Windows 10) AWT, Swing, JavaFX & SWT 2
N JavaFX Installation unter IntelliJ IDEA AWT, Swing, JavaFX & SWT 5
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
B JavaFX openjfx11: intelliJ unter Ubuntu 18.10 kann nicht auflösen AWT, Swing, JavaFX & SWT 4
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
S Kein JFrame unter Mac? AWT, Swing, JavaFX & SWT 8
Blender3D Swing KeyBoardListener funktioniert nicht unter UBUNTU AWT, Swing, JavaFX & SWT 7
V Swing Button soll unter anderem Button sein AWT, Swing, JavaFX & SWT 2
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
L JavaFX Scene wechseln unter FX AWT, Swing, JavaFX & SWT 5
Avarion Swing JFrame unter Windows 10 kleiner ?! AWT, Swing, JavaFX & SWT 2
T ThreadPool sicher beenden unter Verwendung von swt.widgets.Display.syncExec AWT, Swing, JavaFX & SWT 1
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
M Swing Bildbearbeitung unter Java AWT, Swing, JavaFX & SWT 22
S (Swing)Vollbild anzeigen unter Linux/Mac AWT, Swing, JavaFX & SWT 6
D 2D-Grafik Rechteck befindet sich unter dem Rahmen des JFrame. AWT, Swing, JavaFX & SWT 1
T JFrame Icon unter Linux/Ubuntu AWT, Swing, JavaFX & SWT 11
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
SexyPenny90 JLabel liegt unter meiner Turtle AWT, Swing, JavaFX & SWT 5
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
J AWT setBackground(Color.orange) ist unter Win7 Aero nicht orange AWT, Swing, JavaFX & SWT 3
R Problem mit TrayIcon unter Windows/Linux AWT, Swing, JavaFX & SWT 7
M Datei Speichern unter Dialog - SWT AWT, Swing, JavaFX & SWT 3
T JButtons indexiert unter NetBeans anlegen AWT, Swing, JavaFX & SWT 7
S GUI aussehen unter Windows und Linux (und Mac) AWT, Swing, JavaFX & SWT 13
J Applet Kommunikation unter Applets AWT, Swing, JavaFX & SWT 2
I Probleme mit GWT Controls unter Firefox AWT, Swing, JavaFX & SWT 14
A Swing Probleme unter Windows 7 AWT, Swing, JavaFX & SWT 5
F AWT MouseMotionListener e.getButton() ist immer 0 unter Linux und Windows AWT, Swing, JavaFX & SWT 6
F AWT DnD von Dateien mit Sonderzeichen funktioniert unter Linux nicht AWT, Swing, JavaFX & SWT 3
J Swing Natives Menü unter OS X erstellen ? AWT, Swing, JavaFX & SWT 8
C Swing Kleines Programm mit SWING unter Verwendung von MVC AWT, Swing, JavaFX & SWT 5
G SWT-App läuft nicht unter OSX, unter Win aber problemlos AWT, Swing, JavaFX & SWT 3
H Y-Position mit get-/setLocation() unter Linux/Enlightement16 inkonsistent AWT, Swing, JavaFX & SWT 3
G SWT Linie unter transparentes Canvas zeichnen AWT, Swing, JavaFX & SWT 4
M KeyListener Problem unter Firefox AWT, Swing, JavaFX & SWT 2
G Quaqua unter Windows AWT, Swing, JavaFX & SWT 15
B LaF unter KDE AWT, Swing, JavaFX & SWT 2
SuperSeppel13 Swing Fehlende Komponenten unter Mac OS X AWT, Swing, JavaFX & SWT 8
M Swing GroupLayout unter Java 1.5 AWT, Swing, JavaFX & SWT 20
M JMenu teilweise unter einer JComponent AWT, Swing, JavaFX & SWT 4
B Button identifizieren unter MouseEvent AWT, Swing, JavaFX & SWT 7
W WindowsLookAndFeel unter Mac AWT, Swing, JavaFX & SWT 5
A Swing LAF unter Windows: javax.swing.DebugGraphics cannot be cast to java.awt.Graphics2D AWT, Swing, JavaFX & SWT 5
N JDesktop unter Linux AWT, Swing, JavaFX & SWT 4
C JComboBox funktioniert nicht unter Mac OS X AWT, Swing, JavaFX & SWT 2
P Swing [gelöst/erledigt] Gleicher Code läuft unterschiedlich unter Linux und Windows AWT, Swing, JavaFX & SWT 5
U Grafikkontext unter JButtons? AWT, Swing, JavaFX & SWT 5
M Probleme unter Linux AWT, Swing, JavaFX & SWT 7
E Hat Netbeans unter Linux kein Designer für Swing? AWT, Swing, JavaFX & SWT 3
D Probleme mit Java Swing unter Mac OSX AWT, Swing, JavaFX & SWT 13
F Statuszeile unter Swing AWT, Swing, JavaFX & SWT 4
P Programm terminiert nicht (unter Eclipse) AWT, Swing, JavaFX & SWT 5
V Swing: System-Look&Feel unter KDE AWT, Swing, JavaFX & SWT 3
L Problem mit "setVisible" unter LINUX AWT, Swing, JavaFX & SWT 5
gieser jToggleButton: Text unter Bild AWT, Swing, JavaFX & SWT 2
G SWT Button mit Image und ohne Rand unter Linux? AWT, Swing, JavaFX & SWT 7
M Wo bring ich die datenbankanfragen unter? AWT, Swing, JavaFX & SWT 22
G Problene mt Focus unter Swing AWT, Swing, JavaFX & SWT 7
D AWT drawString funktioniert nicht unter Linux AWT, Swing, JavaFX & SWT 7
G AnfängerSWING Frage Werkzeugleiste unter dem Menu AWT, Swing, JavaFX & SWT 3
Noar IllegalComponentStateException unter Gnu/Linux AWT, Swing, JavaFX & SWT 2
T % von Komponenten unter Layoutmanager AWT, Swing, JavaFX & SWT 2
S JTable: Zeile unter MouseCursor farblich hervorheben AWT, Swing, JavaFX & SWT 2
Firefork JPopupMenu unter einem Schalter darstellen AWT, Swing, JavaFX & SWT 2
D Programm läuft unter XP aber nicht unter Knoppix AWT, Swing, JavaFX & SWT 6
ARadauer jtable drucken unter java 1.3 AWT, Swing, JavaFX & SWT 2
T Pobleme beim Druck unter Java AWT, Swing, JavaFX & SWT 2
M Keine Buttons oder sonstige Objekte in JFrame unter Linux AWT, Swing, JavaFX & SWT 4
J JSlider regaiert unter Java 1.6 nicht mehr AWT, Swing, JavaFX & SWT 7
R Drucken unter jdk 1.4 mit JTable AWT, Swing, JavaFX & SWT 11
C Thread - Beendigung unter Swing abwarten AWT, Swing, JavaFX & SWT 6
T JGoodies unter Windows 98 AWT, Swing, JavaFX & SWT 4
Z Wie kann ich Text unter den Textfeldern einfügen? AWT, Swing, JavaFX & SWT 3
F AWT Programm unter Linux anders als unter Windows ! AWT, Swing, JavaFX & SWT 8
M JDialog unter win und linux unterschiedliche größe nötig? AWT, Swing, JavaFX & SWT 4
F Schriftarten unter Windows und Linux AWT, Swing, JavaFX & SWT 6
M [SOLVED]komponenten unter einem JTabbedPane AWT, Swing, JavaFX & SWT 2
S AWT unter Gnome AWT, Swing, JavaFX & SWT 2
T Tray-Icon-Menü unter Linux AWT, Swing, JavaFX & SWT 10
J JFrame Icon unter Linux AWT, Swing, JavaFX & SWT 2
M .txt unter Verwendung von JSpinner in Textfeld schreiben AWT, Swing, JavaFX & SWT 4
H AbsoluteLayout nicht nur unter Netbeans AWT, Swing, JavaFX & SWT 5
B Graues Feld unter JComboBox AWT, Swing, JavaFX & SWT 2
I Drag and Drop funktioniert unter Linux nicht AWT, Swing, JavaFX & SWT 6
H removen unter SWT AWT, Swing, JavaFX & SWT 4
G Buttonschriftart unter SWT AWT, Swing, JavaFX & SWT 2
K g.DrawImage unter paintComponent klappt nur beim 1. Aufruf AWT, Swing, JavaFX & SWT 3
V Wie kann man SWT-TabItems unter Pocket PC oben anzeigen? AWT, Swing, JavaFX & SWT 2
B Komische Darstellung unter Windows 2000 AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben