Netzwerkspiel, Komponenten neu zeichen

lucas66

Grünschnabel
Hallo,

ich würde gern (bzw. muß) ein Spiel programmieren. Dazu habe ich ein Swing-Fenster gemacht. Zur Zeit werden die Komponenten im Konstruktor erzeugt und dem Content-Pane zugefügt. (Swing, weil ich mit JLabel arbeite, die ImageIcons enthalten).

Nun möchte ich erreichen, daß einmal das Fenster geöffnet wird. Danach sollten mittels einer Methode, die aufgerufen wird, einzelne Komponenten ersetzt werden (mit setIcon usw)
Wir mache ich das denn am Besten, daß das Fenster einmal geöffnet und dann nur aktualisiert wird?

Danke Gruß Ramona
 
Hallo Ramona,

normalerweise brauchst Du ein Label nicht zu aktualisieren. Wenn Du ein neues Icon über setIcon()-Methode setzt, sollte das Label sofort das neue Icon anzeigen. Wenn das nicht automatisch passiert, versuche doch einfach die repaint() Methode von dem Label aufzurufen und, wenn das nicht hilft, die updateUI()-Methode:
Java:
final JLabel label = new JLabel();
//...
label.setIcon(icon);
label.repaint();
// oder...
label.updateUI();

Grüße
Vincent
 
Hallo,

danke schon mal für die Antwort. Ich meinte es allerdings etwas anders, habe mich wahrscheinlich nicht gut ausgedrückt.

Also ich habe ein Klasse, die das Spielfeld zeichnet und einen Leylistener enthält.

public class Levelpainter extends JFrame implements KeyListener {

public LevelpainterVector() {

}

public void keyPressed(KeyEvent e){
}

public void setField() {
//z.B.
label[0].setIcon(r1);
}

}

Diese Klasse enthält einen Konstruktor, in dem JLabel erzeugt und dem contentPane zugefügt werden. Wenn ich von der Klasse in der Testklasse ein Objekt erzeuge, wird der Konstruktor aufgerufen und das Spielfeld gezeichnet.


In der Klasse gibt es die Listener-Methode. Z.B. wenn 'r' gedrückt wird, soll die Klasse
Gameintelligence aufgerufen werden. Dabei werden bestimmte Variablen übergeben und in der Spielintelligenz ausgewertet.

Jetzt soll die Spielintelligenz wiederum die Methode setField() aus der Levelpainter-Klasse aufrufen. Aber sie soll natürlich in dem schon geöffneten Fenster zeichnen, und kein neues Fenster erzeugen. Das passiert ja, wenn ich ein Objekt der Klasse Levelpainter erzeuge, um die Methode setField() aufzurufen.

Ich hoffe jetzt ist es besser erklärt. Habe wahrscheinlich einfach einen Denkfehler. Würde mich sehr über Hilfe freuen.
Gruß Ramona
 
Moin!
Völlig wurscht, ob es sich dabei um GUI Klassen oder irgendwas anderes handelt.. Es ist doch immer die gleiche Vorgehsnweise!!:
Übergib beispielsweise deiner Klasse GameIntelligence eine Referenz auf deinen LevelPainter. Entweder im Konstruktor, oder bei dem entsprechenden Methodenaufruf.

z.B.:
Code:
//In LevelPainter

public void keyPressed(){
       new GameIntelligence(this, andere Argumente);
}

Code:
public class GameIntelligence{
   public GameIntelligence(LevelPainter paint, andere argumente){
      //berechnungen ausfuehren 
      paint.setField();
  }

}

*grüssle*
MeinerEiner
 
Verstehe, Du hast also kein Refresh-Problem bei den Labels, sondern ein klassisches "Instanz-Abhängigkeitsproblem". Was ich auf jeden Fall vermeiden würde, ist eine zyklische Abhängigkeit zu schaffen, z.B. Instantz "A" kennt Instanz "B" und Instanz "B" kennt Instanz "A" und sie rufen gegenseitig ihre Methoden auf. Das ist kein guter Programmierstil.

Wie wäre es damit: Du rufst aus der keyPressed()-Methode Deine Klasse Gameintelligence auf und bekommst als Rückgabewert alles, was Du zum Setzen von neuen Icons brauchst. Danach rufst Du die Methode setField() auf (aus der keyPressed()-Methode heraus) und übergibst ihr die nötigen Parameter.

Grüße
Vincent
 
Hallo,

ja das war genau mein Problem. Konstruktor war schon immer meine große Schwachstelle. Cool jetzt läuft es, und auch noch so einfach.

Vielen Dank

Gruß Ramona
 
Zurück