Wie kann Java auf ein User-Input warten?

1 Antwort

1) Was soll das Interface Variables beinhalten? Es klingt für mich aufgrund des Namens schon verdächtig nach Missdesign.

2) Das Commands-Objekt, welches du in Draw kreierst, würde ich direkt an den KeyHandler weitergeben. So sparst du dir den Speicherplatz für ein zweites und kannst Zustände teilen.

3) Das Panel wird nur einmal gezeichnet. Du musst Swing einen Hinweis geben, dass die Komponente neu gezeichnet werden sollte (daraufhin reiht Swing diese Aktion in seine Queue, um sie bei nächster Gelegenheit abzuarbeiten). Eine tatsächliche Game Loop musst du dir erst selbst bauen (nicht umsonst habe ich dir bei deinen vorherigen Fragen Tools wie libGDX empfohlen).

Die nächstbeste Option, eine Game Loop in Swing zu bauen, wäre der Einsatz eines Swing Timers. Ein Beispiel, auf dem sich aufbauen lässt, findest du hier.

4) System.in stellt den Standardeingabekanal für Konsolenprogramme dar. Die GUI hingegen kommuniziert nicht darüber. Mit deinem Aufruf hast du einfach nur den GUI-Thread blockiert.

Morgoth364 
Fragesteller
 04.01.2022, 15:29

1. In dem Interface habe ich Variablen definiert, die ich in mehreren Klassen benötige. Dort ist zum Beispiel auch UNIT_SIZE definiert.

Was wäre ein besserer Weg?

2. Wie würde ich das Objekt dann an KeyHandler weitergeben? Und was ist mit "Zustände teilen" gemeint?

3. Ich wollte mich erst mal weiter in JavaSwing und dann JavaFX einarbeiten, bevor ich mich dann z.B. libGDX oder jMonkeyEngine zuwende.

4. Um jetzt die GUI neu zu zeichnen, muss ich also ein Objekt von ActionListener erstellen und dann von da die repaint() Methode aufrufen?

0
regex9  04.01.2022, 16:14
@Morgoth364
  1. Naja, du missbrauchst das Interface gerade als Endlager. Die Felder sollten der Klasse zugeordnet werden, der sie logisch zugehörig sind. Da deine Klasse Draw offensichtlich das Spielfeld darstellt, sind Felder für die Spielfeldgröße in ihr auch gut aufgehoben. Da sie den Objektzustand beschreiben, wären es m.E. objektgebundene Felder. Wenn andere Objekte deren Werte brauchen, müssen ihnen diese Werte übergeben werden oder sie benötigen eine Referenz auf das Spielfeld. Für Wertübergaben gibt es Parameter und return.
  2. Als Parameter über den Konstruktor. Die beiden Commands-Objekte haben jeweils einen eigenen Zustand. Wenn sich bei einem von beiden eine Eigenschaft running im Wert ändert, hat das keinen Einfluss auf das andere Objekt. Da du aber in zwei Klassen denselben Zustand erwartest, wäre es sinnig, auch nur ein Objekt zu verwenden.
  3. Und wenn du dich einmal der Webentwicklung zuwenden möchest, versuchst du das erst mit der Android API? 😉
  4. Ich habe doch ein komplettes Beispiel verlinkt?
1