Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen

Lunar

Mitglied
Hey erstmal,
hoffe das ist das richtige Unterforum!

Und tut mir Leid, falls es so ein Thema schon gibt, hab es beim Suchen nicht gefunden.

Ich denke meinen Kenntnisstand könnte man als "Anfänger" bezeichnen.

Mein Problem ist folgendes:
Ich habe Snake als zweidimensionale Reihung programmiert.
Diese soll nun abgebildet werden. Nach einiger Recherche (bisher hatte ich keinerlei Erfahrung mit dem Implementieren von graphischen Oberflächen) und der Verwurstelung mehrer Tutorials und Codeschnipsel bin ich hierzu gekommen:

[CODE lang="java" title="Erzeugung der einzelnen Bildelemente, welche nicht sich nicht ändern"]
public static void main(String args[]) throws InterruptedException {

//create window
JFrame window = new JFrame("Snake");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(800, 600);
window.setLocationRelativeTo(null);
JPanel gamePanel = new JPanel();
window.add(gamePanel);
String[] snake = {"","","","","","","","","",""};
window.setVisible(true);
gamePanel.setVisible(true);
[/CODE]

Später, in einer Schleife, da sich natürlich die Position im Array ändert, folgt dieser Codeschnipsel:

[CODE lang="java" title="Einfügen der eigentlichen Tabelle"]
//insert game into window
JTable game = new JTable(world, snake);
gamePanel.add(new JScrollPane(game));
game.setVisible(true);
[/CODE]

"world" ist hierbei das Array, dass die Snake-Elemente enthält. Es gibt keinerlei Fehlermeldungen, dass Programm läuft auch einfach weiter und hängt nirgends, das ist bereits geprüft.

Ich schätze mal, dass ich hier ziemlichen Spaghetti-Code produziert habe.
Auf jeden Fall wird zwar der/das Frame geöffnet, wenn ich die Methode ausführe, aber leider wird darin nichts und wieder nichts abgebildet, weder eine leere Tabelle, noch eine Scrollbar, noch irgendetwas.

Würde mich deswegen über etwas Hilfe freuen!

MfG
Lunar

P.S.: Würde mich vor allem über Erklärungen freuen, viel mehr als über Codes, welche ich dann kopieren und verwenden kann.
 
Also wenn Du von "in einer Schleife" sprichst, dann vermute ich, dass Du innerhalb des EDT (Event Dispatch Thread) eine Schleife laufen lässt und daher keine Events mehr abgearbeitet werden können ...

Aber ehe ich hier lang und breit erkläre, einfach einmal ein Verweis auf Dokumentation, die Du durchlesen solltest:

In Kurzform: Die Applikation basiert auf Events, die abgearbeitet werden müssen. Ein Event ist z.B. die Aufforderung, dass das Fenster sich neu zeichnen soll. Dies wird bei Veränderungen angetriggert (und wenn Du etwas veränderst und das antriggern willst, dann musst Du das repaint und ggf. auch das revalidate aufrufen. Wichtig: Das sind Aufrufe, die noch nichts anderes machen als ein Event in die Eventqueue zu packen.

Daher musst Du so schleifen in einem eigenen Thread ausführen, damit der EDT weiter Events abarbeiten kann (und das Fenster auch neu gemalt werden kann).

Da kommt dann aber noch die zweite Besonderheit: Alle Swing Elemente mögen es in der Regel gar nicht, wenn diese außerhalb des EDT verändert werden. Wenn Du also ein Element hinzufügen oder verändern willst, dann sollte dies innerhalb des EDT erfolgen. Das kannst Du dadurch erreichen, dass Du ein invokeLater Aufruf durchführst (Siehe Link! Das wird da auch erläutert!). Das macht dann aber unter dem Strich auch nichts anderes, als ein entsprechendes Event in die Queue zu packen, das dann besagt: "mach das mal.".

Das als ganz kurze Erläuterung.
 
Hi,
danke erstmal für die Antwort!
Verstehe zwar hauptsächlich Bahnhof, aber denke, das wird sich mit dem Lesen/Verstehen des Links legen.
Mit "einer Schleife" ist durchaus eine einfache "while-Schleife" gemeint. Weiß nicht, ob das unter EDT fällt, schätze mal nicht. Da bei Snake ja jede Runde das selbe vom Programm ausgeführt wird (Bewegen in eine Richtung, abhänigig von der Richtung des Kopfes + mögliche Events die über Variablen getriggert werden) hat mir das gereicht. Sollte ich das besser umschreiben?

Einen Teil des Problems habe ich bisher wahrscheinlich gar nicht benannt, bzw. nicht klar genug herausgestellt: Warum sehe ich gar nichts in meinem Fenster, außer dem (standart-) grauen Hintergrund? Müsste nicht selbst bei einem Fehler in der Änderung des Frameinhalts wenigstens zuvor mehr als nur der Frame dargestellt werden?

MfG
Lunar
 
Ein Vergleich, der etwas hinkt: EDT ist wie ein Postbote. Er nimmt immer einen Brief (Event) von einem Stapel und gibt ihn an den Adressaten. Aber er muss warten, bis der Empfänger den Brief verarbeitet hat.

Nun kommt ein Brief zu Dir und Du nimmst ihn an und dann machst Du irgendwas - aber kommst nie zu einem Ende. Dann ist der Postbote vor Deiner Tür und wartet und alle anderen Briefe stapeln sich und werden nicht ausgetragen.

Daher: Alles, was eine gewisse Zeit läuft wird in einen separaten Thread ausgelagert. Also jegliche (lang laufnden) Schleifen oder sonst irgendwas sind - ohne dass Du es auslagerst - ein absolutes NO GO.

Und ja - dann hast Du nur ein leeres, graues Fenster. Denn Der Maler, der den Inhalt malt, macht dies nur, wenn der Postbote ihm einen Brief mit entsprechendem Auftrag bringt. Und genau der Brief kommt nicht, weil der Postbote auf Deine while Schleife warten ...
 
Hi,
okay, danke für den Nachtrag!
Werde mich dann wohl mal etwas mit Threads, etc. beschäftigen bevor ich weitermache!

MfG
Lunar
 

Zurück
Oben