JPanel als einziges nutzbar

Ich möchte das ein JPanel von mir zeitweise als einziges zu nutzen ist! Sollte jemand auf die Idee kommen ein anderes JPanel oder einen anderen Swing-Componenten zu benutzen soll ein “Bing” Geräusch ertönen!
Ihr kennt das vielleicht von JFileChooser…

Jemand ne idee wie das zu bewerkstelligen ist?

Danke

Das geht mit einem modalen [japi]JDialog[/japi].

Danke schonmal,
aber wie kann ich die modalen Dialoge denn als JPanel verwenden?
Also kein Rand, Componenten hinzufügen und entfernen etc…

Als JPanel verwenden im Sinne von in einem Container verbauen geht nicht - zumindest ist das nicht vorgesehen, aber man kann einen JDialog modal vor dem JFrame der Anwendung (wie der JFileChooser) anzeigen lassen. Man verwendet ihn ähnlich die ein JFrame: Komponenten hinzufügen geht genauso. Rand entfernen geht mittels setUndecorated.

Ein Panel so “modal” machen geht erstmal nicht, und ich bin auch nicht sicher wie sich das äußern sollte. WANN sollte man denn NICHT mehr nur das Panel nutzen können? Das Panel… und alle Components, die es enthält (!?). Man könnte sich da natürlich alle möglichen Tricks überlegen, angefangen von einer GlassPane, die nur Events zum Panel durchläßt, in Kombination mit einem FocusListener, der verhindert, dass man mit ‘Tab’ in andere Components reinspringt, aber … das ist wohl so ein Fall, wo es sinnvoll ist, mal das eigentliche Ziel zu hinterfragen…

Ok, also mein Problem ist folgendes:
Ich möchte in einem Spiel eine Map laden(dafür der Dialog bzw. das jpanel das dessen Eigenschaften haben soll).
Während der User die Map aussucht soll er nichts anderes machen können(oder alternativ: wenn er etwas anderes macht soll das Panel wieder verschwinden).
Ich hab schon ein paar Dinge versucht FocusListener(müsste für jeden Componenten im Panel gemacht werden und funktioniert selbst dann semioptimal…).
Mir sind jetzt langsam die Idee’n ausgegangen und da kam ich auf JDialog!
Hab mein “extends JPanel” zu “extends JDialog” geändert und tada:
“BoxLayout can’t be shared…”
und auch noch eine NullPointerException
Naja ich bin gerade irgendwie mit meinem Latein am Ende…

[QUOTE=Von .org;59951]“BoxLayout can’t be shared…”
und auch noch eine NullPointerException[/QUOTE]
Die Layout Instanz kann nur einmal/für eine Komponente verwendet werden (muss man beim BoxLayout nicht ohnehin die Komponente auf die das Layout angewendet wird im Konstruktor übergeben?)
NullPointerException heißt ja “nur” das die Referenz einer Variable auf die zugegriffen wird ins Leere geht. Sollte sich ja leicht rausfinden lassen welche (die Zeile wird ja in der Fehlermeldung angegeben) und warum…

Schon klar, aber das einzige was ich geändert habe ist “extends JPanel” zu “extends JDialog”

Naja, die Änderung von JPanel zu JDialog ist ja nicht unbedingt klein, führt aber sicher nicht zwangsläufig zu solchen Fehlern.
Ohne den Code zu kennen kann man da aber nicht allzu viel dazu sagen.

Hm, hat jemand vielleicht eine Idee wie ich herausfinden könnte ob irgendein Component in dem JPanel ausgewählt ist?
Mein Ansatz ist so(dafür das der Focus am Anfang beim Panel liegt ist gesorgt):

        addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {}
            @Override
            public void focusLost(FocusEvent e) {
                        try {
                            Thread.sleep(10000);
                        } catch (InterruptedException ex) {}
                        boolean anyOneFocused = false;
                        for (Component c:getAllComponentsOf(MapChooser.this)) {
                            if (c.hasFocus()) {
                                anyOneFocused = true;
                            }
                        }
                        setVisible(anyOneFocused);
            }
        });```

Natürlich funktioniert das ganze nicht wieso weiß ich nicht!
die Methode getAllComponentsOf(MapChooser.this) liefert zuverlässig alle Componenten des Panels!

Ich denke, man könnte die Glasspane über dem gesamten Frame aktivieren, so dass zumindest alle Mousevents abgefangen werden. Die Glasspane müsste dann schauen, ob das Event über dem Panel stattfindet, und entsprechend weiterleiten, oder eben “Bing” machen. Nicht ganz trivial, aber auch kein Hexenwerk. Siehe http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html