Automatisches Updaten von Labels etc.

Hallo,

ich habe mir ein klein wenig Java selbst beigebracht, ein noch kleineres bisschen in bisher drei Jahren Java-Unterricht in der Schule gelernt. Die Grundgedanken von OOP glaube ich auch zu verstehen, nur ob ich sie bereits praktisch umsetze, kann ich nicht wirklich einschätzen. Auch wenn ich (solange ich nur Taschenrechner oder textbasierte Rollenspiele schreibe) meist irgendwie an mein Ziel komme, habe ich sehr oft das Gefühl, dass ich völlig umständliches Zeug zusammenschreibe.

Zum Beispiel folgendes:
public void update_All() {


rechnungen.setLevelCap();

jProgressBar1.setMaximum(Held.hp);
jProgressBar1.setValue(Held.khp);
jProgressBar1.setString(Integer.toString(Held.khp));

jProgressBar2.setMaximum(Gegner.hp);
jProgressBar2.setValue(Gegner.khp);
jProgressBar2.setString(Integer.toString(Gegner.khp));

jLabel4.setText(Double.toString(Held.skillpunkte));
jLabel8.setText(Double.toString(Held.skillpunkte));
jLabel14.setText(Integer.toString(Held.st));
jLabel16.setText(Integer.toString(Held.exp));
jLabel17.setText("/ " + Integer.toString(rechnungen.lvlcap));
jLabel19.setText(Double.toString(Held.gold));
jLabel21.setText(Integer.toString(Held.stufe));
jLabel40.setText(Integer.toString(Held.dex));
jLabel41.setText(Integer.toString(Held.zp));

jLabel43.setText(Integer.toString(Held.st));
jLabel45.setText(Integer.toString(Held.dex));
jLabel47.setText(Integer.toString(Held.zp));

jLabel61.setText(Integer.toString(Held.st));
jLabel63.setText(Integer.toString(Held.dex));
jLabel65.setText(Integer.toString(held.getHeldAW()));
jLabel67.setText(Integer.toString(held.getHeldRW()));
jLabel51.setText(Integer.toString(Gegner.stufe));
jLabel53.setText(Integer.toString(Gegner.st));
jLabel55.setText(Integer.toString(Gegner.dex));
jLabel58.setText(Integer.toString(gegner.getGegnerAW()));
jLabel59.setText(Integer.toString(gegner.getGegnerRW()));


if (Held.skillpunkte <= 0) {
jComboBox4.setEnabled(false);
jComboBox5.setEnabled(false);
jComboBox6.setEnabled(false);
} else {
jComboBox4.setEnabled(true);
jComboBox5.setEnabled(true);
jComboBox6.setEnabled(true);
}


}

Diese Funktion wird in meinem kleinen simplen Swing-Rollenspiel bei praktisch jedem Klick auf Buttons ausgeführt, sprich ich habe manuell in jedes Button-Event update_ALL(); reingeschrieben.

Dass ich auch nur die Swing-Elemente updaten könnte, die bei dem Klick auf entsprechende Buttons tatsächlich verändert werden, ist mir zwar klar, nur müsste ich dann halt obige Funktion in viiele kleine aufsplitten, was nur noch mehr Arbeit wäre.

Ist es möglich, quasi sowas wie einen Hintergrundprozess laufen zu lassen, der einfach folgendes macht:

if [element].hat-sich-verändert {
[element].update; }


Und zwar automatisch für alle Elemente, ohne für jedes einzelne Textfeld so eine Funktion schreiben zu müssen? Und natürlich auch noch für einen Anfänger umsetzbar?

Gruß, Forks
 
Naja, es gibt verschiedene Modelle, das zu lösen.

Am einfachsten und für dich am sinnvollsten wäre es wohl, wenn du einzelne Update-Funktionen schreibst, die gleichzeitig die Werte des Helden ändern und die Ausgabe-Controls aktualisieren.
Code:
void increasedHealth(int newMaxHealth) {
  Held.hp = newMaxHealth;
  jProgressBar1.setMaximum(Held.hp);
}

void levelup() {
  Held.skillpunkte += 5;
  jLabel4.setText(Double.toString(Held.skillpunkte)) ;
  jLabel8.setText(Double.toString(Held.skillpunkte)) ;
  jComboBox4.setEnabled(true);
  jComboBox5.setEnabled(true);
  jComboBox6.setEnabled(true);
}

void increasedSkill() {
  jLabel4.setText(Double.toString(Held.skillpunkte)) ;
  jLabel8.setText(Double.toString(Held.skillpunkte)) ;
  if (Held.skillpunkte <= 0) {
    jComboBox4.setEnabled(false);
    jComboBox5.setEnabled(false);
    jComboBox6.setEnabled(false);
  }
}

...

Eine andere Möglichkeit wäre es, den Helden-Objekt verschiedene Listener für Änderungen zu geben, die aufgerufen werden, wenn z.B. die Skillpunkte erhöht werden, und welche die Änderungen an der Oberfläche vornehmen.

Als dritte Möglichkeit könntest du die grafischen Anzeigeobjhekte direkt in der Held-Klasse speichern und bei einer Änderung an einem Attribut das Update der zugehörigen Elemente vornehmen.

Als vierte und letzte Möglichkeit in meiner Liste könntest du auch eine Renderer-Klasse schreiben, die die Status-Anzeigen zu deinem Held als Bild auf den Bildschirm malt und bei einer Änderung des Helden-Objekte diese sofort beim nächste Neuzeichnen des Bildes (also sofort) übernimmt.

mfg, metax.
 
Die einfachste deiner Methoden ist so offensichtlich, dass ich mich ein wenig schäme, das nicht einfach gleich so gemacht zu haben :wall:
Ich habe bisher so Funktionen wie LevelUp immer in die Klasse des dazugehörigen Objektes geschrieben, also LevelUp() in die Held-Klasse usw. Und ich habe nicht rausfinden können, wie ich GUI-Elemente aus der View-Klasse von der Held-Klasse aus aufrufen kann, siehe weiter unten, dritter Absatz.

Auch das mit den Listenern sollte ich mit ein paar Tutorials hinkriegen. Ich ging bisher davon aus, dass man nur GUI-Objekten Listener geben kann. Wieder was wichtiges gelernt... Das würde das ein oder andere Programm bei mir warscheinlich auf die Hälfte der benutzten Code-Zeilen reduzieren :D

Das, was du in der dritten Methode beschreibst, wollte ich schon ein paar mal versuchen, ich war dann jedoch mit den vorhandenen Online-Hilfen zu ungeduldig bzw. habe mir noch gar nicht genauer durchgelesen, wie man Dinge in andere Klassen auslagert -> Ich habe bisher meist Netbeans benutzt für GUIs, wo einem automatisch die [projektname]View-Klasse angelegt wird. Ich habe es nie geschafft, Swing-Objekte in eine andere Klasse auszulagern.

Meist fängt diese View-Klasse dann damit an, dass ich in ihr
Code:
    static public Runde runde1 = new Runde();
    static public Spieler mensch = new Spieler();
...
reinschreibe, damit ich wenigstens VON der View-Klasse aus die Funktionen der anderen Klassen aufrufen kann (also z.b. in der View-Klasse "mensch.LevelUp();". :rolleyes:

Die Vierte klingt nach dem, was ich dann mal können will, wo ich mir derzeit aber sicher bin, dass meine Programmier-Lust nicht ausreicht, um nicht durch das viele Trial&Error die Motivation zu verlieren. Das ist aber etwas, was ich "irgendwann mal" auch lernen möchte.

Vielen Dank schonmal für die Tips :thumb_up:
 
Zuletzt bearbeitet:
Zurück
Oben