IllegalComponentStateException The Frame is Displayable

TackerGollum

Mitglied
Hallo Leute,
Ich habe ein Problem. Und zwar schmeißt mir mein Programm zum Start ganz kurz eine "IllegalComponentStateException" die ist leider aber nur so kurz da, dass ich sie weder richtig lesen , noch sie screenen kann. nach weniger als einer halben Sekunde verschwindet diese und das Programm startet bisher ganz normal, aber bevor das Programm nachher größer wird und ich dann alles umsonst programmiert habe, weil ich den Fehler nicht behoben bekomme, stelle ich lieber Jetzt diese Frage.

Wie eben schon erwähnt schmeißt mir Eclipse diese "IllegalComponentStateException" das einzige Was ich danach noch lesen kann ist "The Frame is Displayable" und dann verschwindet Sie und das Programm startet. Hat irgendjemand eine Ahnung woran das liegt? eigentlich sollte die Exception gar nicht fliegen, da ich "setUndercorated(true)" verwende bevor das Fenster überhaupt sichtbar gemacht wird.

hier mein Code:

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class GUI extends JFrame {
    private boolean isAltPressed = false;
    private boolean isEnterPressed = false;
    private boolean isDecorated = true;
    private JFrame frame = new JFrame();

    public GUI(String titel) {
        super(titel);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setUndecorated(true);
        frame.setTitle(titel);
        frame.setLayout(new GridLayout(0,1));
      
        // JFrame-Einstellungen
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setSize(screenSize);
      
        frame.setResizable(false);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.addKeyListener(new MyListener());
        // JFrame sichtbar machen
        frame.setVisible(true);
      
    }

    private class MyListener implements KeyListener {

        @Override
        public void keyTyped(KeyEvent e) {
            // Keine spezielle Aktion für keyTyped
        }

        @Override
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();

            if (keyCode == KeyEvent.VK_ALT) {
                isAltPressed = true;
            }

            if (keyCode == KeyEvent.VK_ENTER) {
                isEnterPressed = true;
            }

            // Überprüfen, ob sowohl Alt als auch Enter gedrückt sind
            if (isAltPressed && isEnterPressed) {
               
                if (isDecorated) {
                    frame.dispose(); // Altes Fenster schließen
                    frame.setUndecorated(false); 
                    frame.setVisible(true); // Neues, dekoriertes Fenster erstellen
                    isDecorated = false; // Zustand aktualisieren
                    isAltPressed = false;
                    isEnterPressed = false;
              
                }else {
                    frame.dispose();
                    frame.setUndecorated(true);
                    frame.setVisible(true);
                    isDecorated = true;
                    isAltPressed = false;
                    isEnterPressed = false;
                }
              
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {
            int keyCode = e.getKeyCode();

            if (keyCode == KeyEvent.VK_ALT) {
                isAltPressed = false;
            }

            if (keyCode == KeyEvent.VK_ENTER) {
                isEnterPressed = false;
            }
        }
    }


}

Ich würde mich über Eure Hilfe wahnsinnig freuen. :)
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Also was ich gerade so sehe, sieht es eigentlich auch alles ok aus. Daher wäre es wichtig, einmal Details der Exception zu erfahren.

Die beschriebene Exception kommt, wenn du setUndecorated(true) auf einem JFrame aufrufst, das bereits native Ressourcen hat und damit dargestellt werden kann. Aber im geposteten Source hast Du diese Aufrufe nur
  • direkt nach dem Konstruktor
  • direkt nach einem dispose

Und das ist beides ok.

Sicher, dass Du wirklich diesen Code ausführst? Nicht dass Du Build Fehler hast und Du dann die letzte übersetze Version ausführst? Das nur als eine fixe Idee.
 

Robert Zenz

Top Contributor
Die beschriebene Exception kommt, wenn du setUndecorated(true) auf einem JFrame aufrufst, das bereits native Ressourcen hat und damit dargestellt werden kann.
Nur kurz darueber geguckt, aber dispose muesste alle nativen Resourcen verwenden und die sollten erst bei show oder pack wieder erzeugt werden:

The Window and its subcomponents can be made displayable again by rebuilding the native resources with a subsequent call to pack or show.

Wie das da zusammenhaengt kann ich aber nicht sagen.
 

TackerGollum

Mitglied
@KonradN Erstmal danke für die schnelle Antwort. Und ja ich führe genau diesen Code aus denn in der Main Methode hab ich zur Zeit nur :
Java:
public class Program extends JFrame {
    private static final long serialVersionUID = -7739728431010817092L;

 

    public static void main(String[] args) {
        new GUI("Test");
    }
}

das hier stehen und Fehler zeigt Eclipse mir auch nicht an. Alles was ich bisher in diesem Programm programmiert hab seht ihr in dem Post und in dieser Antwort.
 

KonradN

Super-Moderator
Mitarbeiter
Nur kurz darueber geguckt, aber dispose muesste alle nativen Resourcen verwenden und die sollten erst bei show oder pack wieder erzeugt werden
Du meinst verwerfen oder so? Statt verwenden?

Die Beschreibung von Window#dispose() beschreibt das aber sehr gut:
Releases all of the native screen resources used by this Window, its subcomponents, and all of its owned children. That is, the resources for these Components will be destroyed, any memory they consume will be returned to the OS, and they will be marked as undisplayable.
The Window and its subcomponents can be made displayable again by rebuilding the native resources with a subsequent call to pack or show. The states of the recreated Window and its subcomponents will be identical to the states of these objects at the point where the Window was disposed (not accounting for additional modifications between those actions).

Note: When the last displayable window within the Java virtual machine (VM) is disposed of, the VM may terminate. See AWT Threading Issues for more information.

Und die Zusammenhänge sind vermutlich, dass bei einem pack / show die native Elemente, die es ja geben muss, erzeugt werden. Die Java Klassen sind ja nur eine Art Wrapper. Das sieht man recht gut, wenn man sich die Fenster anschaut mit einem Spy/Inspect Tool. Da sind dann aus Windows Sicht die typischen Windows Controls (unter Windows), die man auch als C / C++ Entwickler kannte, wenn man da so eine GUI Anwendung geschrieben hat.

Aber unabhängig: Diese dispose / setUndecorate / setVisible Sequenzen sind genau der Weg, den man gehen muss, wenn man das umschalten will. Das ist also aus meiner Sicht richtig umgesetzt in dem gezeigten Source. (Maximal wäre die andere Idee, dass man das Fenster neu erstellt. In anderen Sprachen wie z.B. C# hat man strengere dispose Pattern und da ist eine Instanz nach dispose nicht mehr zu verwenden. Das ist aber etwas, das in Java nicht so streng gesehen wird)

Ach ja - bezüglich dem Kommentar: Der dispose() Aufruf kann diese Problematik mit dem AWT Thread nicht auslösen, da wir ja im EDT sind und diesen sozusagen "blockieren". So kommt der setVisible Aufruf sozusagen ehe der EDT feststellen kann, dass es kein Fenster mehr gibt.
 

KonradN

Super-Moderator
Mitarbeiter
@KonraN Erstmal danke für die schnelle Antwort. Und ja ich führe genau diesen Code aus denn in der Main Methode hab ich zur Zeit nur :
Java:
public class Program extends JFrame {
    private static final long serialVersionUID = -7739728431010817092L;

   

    public static void main(String[] args) {
        new GUI("Test");
    }
}

das hier stehen.
Wozu das extends JFrame bei Programm und GUI? Beides sind doch keine Frames, die Du erweiterst. Du nutzt Composition, damit GUI dann ein JFrame hat. Aber diese Erweiterung ist unnötig.

Was unkritisch ist, aber etwas auffällt: Im Konstruktor von GUI bist Du noch nicht im EDT aber machst etwas mit dem Status von Swing Controls.
Da könnte man also hin gehen und den Konstruktor von GUI direkt im EDT laufen lassen:
Java:
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new GUI("Test"));
    }

Aber das hat nichts mit der Funktionalität zu tun. Alles, was Du machst funktioniert auch genau so im Hauptthread!

Ich habe Deinen Code auch etwas getestet auf meinem Mac (ok, da ich nicht groß herum probieren wollte, welche der Tasten als "alt" Taste angesehen wird, habe ich da das if (isAltPressed && isEnterPressed) auskommentiert, so dass jeder Tastendruck umschaltet und das lief einwandfrei bei mir.
 

TackerGollum

Mitglied
Wozu das extends JFrame bei Programm und GUI? Beides sind doch keine Frames, die Du erweiterst. Du nutzt Composition, damit GUI dann ein JFrame hat. Aber diese Erweiterung ist unnötig.

Was unkritisch ist, aber etwas auffällt: Im Konstruktor von GUI bist Du noch nicht im EDT aber machst etwas mit dem Status von Swing Controls.
Da könnte man also hin gehen und den Konstruktor von GUI direkt im EDT laufen lassen:
Java:
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new GUI("Test"));
    }

Aber das hat nichts mit der Funktionalität zu tun. Alles, was Du machst funktioniert auch genau so im Hauptthread!

Ich habe Deinen Code auch etwas getestet auf meinem Mac (ok, da ich nicht groß herum probieren wollte, welche der Tasten als "alt" Taste angesehen wird, habe ich da das if (isAltPressed && isEnterPressed) auskommentiert, so dass jeder Tastendruck umschaltet und das lief einwandfrei bei mir.
Vielleicht sollte ich mal den Rechner neu starten und das ist einer der berüchtigten "Fehler die keine Fehler sind" von Eclipse.
 

TackerGollum

Mitglied
Danke für eure Hilfe ^^

Es war genau das. einer von diesen ominösen Fehlern die Eclipse gern mal anzeigt die aber keine Fehler sind.
Ich habe nur Eclipse neu gestartet und siehe da .... Fehler ist weg.

trotzdem Danke für eure Mühen. ^^
Ich wünsche euch noch einen schönen Tag. :)
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
Noar IllegalComponentStateException unter Gnu/Linux AWT, Swing, JavaFX & SWT 2
T java.awt.IllegalComponentStateException bei JPopupMenu AWT, Swing, JavaFX & SWT 6
N Swing Unterscheidung neues Frame erstellen oder vorhandenes nach vorne holen AWT, Swing, JavaFX & SWT 11
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
N Swing Frame mit GlassPane und Popup AWT, Swing, JavaFX & SWT 5
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

Ähnliche Java Themen


Oben