Werte durch Options-GUI ändern

spinnerboy

Mitglied
Hallo Forenteam!
Ich arbeite zur Zeit an einem einfachen Kartenspiel.
Nun möchte ich gerne verschiedene Kartensets zur verfügung stellen, nämlich erstmal "Default" und "Kawasaki" zum Beispiel.
Die Pfade sind
Code:
Images/Karten/Default/Karo7.png"
und
Code:
Images/Karten/Kawasaki/Karo7.png"
also nehme ich als Pfad einfach
Code:
Images/Karten/"+kartenset+"/Karo7.png"
wobei
Code:
public String kartenset = new String("Default");
ist.
Nun möchte ich in der Klasse "Optionen" Buttons für jedes Kartenset einfügen.
Diese heißen
Code:
jbtn_default
und
Code:
jbtn_kawasaki
und ich habe versucht die Werte durch
Java:
  public void jbtn_kawasaki_ActionPerformed(ActionEvent evt)
  {
    kartenset.setText("Kawasaki");
  }
zu ändern, allerdings ist der String kartenset ja nicht in der Klasse Optionen.
Was kann ich tun, damit ich die Information aus der Klasse Optionen in die Klasse Karte bekomme ohne ein neues Objekt zu erstellen? Es bringt mir ja nichts, eine Karte in den Optionen zu erstellen um dort ihr Bild zu ändern, wenn das Spiel selbst seine eigenen Karten erzeugt.
Bitte um Hilfe!
LG, spinner 🙂
 
Ich empfehle die Bilder für die Kartensets von der Karte zu trennen. Die Bilder kannst du z.B. via Klasse KartenSet laden und cachen. Willst du ein anderes Deck kannst du es via dieser Klasse laden. Die Klasse Karte braucht davon nichts zu wissen.
 
Dann hätte ich wiederum das Problem, dass ich von Optionen nicht auf KartenSet zugreifen könnte (einfach weil ich nicht weiß wie das geht 😀) und es wäre das selbe wie wenn ich von Optionen nicht auf Karte zugreifen kann, oder?
 
Generel gesagt darf/muss die GUI Komponenten (Optionen) referenzen auf die Model Klassen halten. Der umgekehrte Weg sollte vermieden werden.

Desweiteren sollte eine Zentrale Klasse die Steuerung des KartenDecks übernehmen oder willst du bei einem Change jede einzelne Karte ändern?
 
Ich weiß leider nicht was am bisherigen Aufbau so falsch sein soll, ich muss doch nur einen String durch einen Buttondruck in der GUI "Optionen" nach außen in die Klasse "Karte" geben, da änder ich doch nicht jede Karte einzelnd sondern den Ordnerpfad, oder wie ist das jetzt gemeint?
Oder um vom direkten Projekt abzukommen und es zu verallgemeinern:
Ich möchte gerne wissen, wie ich den String "kartenset" in der Klasse "Karte" durch einen Druck auf den Button "jbtn_kawasaki" in der Klasse "Optionen" (JFrame mit GUI) verändern kann.

Hoffe so vereinfacht ist es ein wenig verständlicher ;-)
 
Nun, ich bin davon ausgegangen, dass du mehrerhe Karten Instanzen hast. Vielleicht hab ich dich da falsch verstanden. Ausserdem weiss ich nicht wie deine Klassen aussehen, ausser das du in Karte dein Pfad zu den Bildern definiert hast. Daher beruhen meine Aussagen auf Vermutungen 😉

Loesung: Uebergib der Klasse Optionen eine Instanz von Karte und aendere die Karte:
Code:
karte.setKartenset("kawasaki")
 
Entschuldige, daran habe ich nicht gedacht 😀
Es gibt tatsächlich 32 Karten die ich mit anderen Parametern erstelle, allesdings scheinen wir grade ein wenig aneinander vorbei geredet zu haben. Ich bin davon ausgegangen, dass eine Änderung des Strings im Prinzip den Quelltext verändern würde, statt nur ein Objekt.
natürlich hast du völlig recht und mit meiner Methode müsste ich doch alle Karten einzelnd ändern.
Allerdings verwendet die Klasse Optionen bisher noch garkeine Karten, folglich habe ich auch keine Instanz die ich mit karte.setKartenset("kawasaki") ansprechen könnte, da ich dachte, dass es garkeine auswirkung auf meine anderen Klassen, wie zum Beispiel meine HauptGUI hätte... Also ich werde mal den Aufbau Beschreiben.

Es gibt eine Klasse Karte, von dieser werden 32 Instanzen in der Klasse KartenStapel erzeugt. Vom Kartenstapel wird ein Objekt erzeugt in der Klasse GUI. Die GUI wird geöffnet durch die Klasse Menue (auch eine GUI) und aus dem Menü (=Menue) heraus wird die Klasse/GUI Optionen geöffnet.
Ich habe mir also vorgestellt, dass eine Änderung in der Klasse Optionen auch nach einem dispose() noch erhalten bleibt und in der Klasse/GUI "GUI" dann zu sehen ist.

Allerdings bin ich noch ein ziemlicher Anfänger und kann aus Verständnissgründen nicht ganz deiner Idee mit dem KartenSet oder der KartenDeck-Steuerung (Begriff "zentral") folgen, es wäre nett, wenn du die Verknüpfung einmal als Code andeuten könntest.
LG, spinner 🙂
 
Ich will versuche es einfach zu machen. Karten und Kartenstapel sind Model-Komponenten. Das heist diese speichern alle relevanten Daten.

Ganz Allgemein: GUI-Komponenten lesen die Daten aus den Models und rendern den entsprechenden Output. Soll ein Wert veraendert werden geschieht dies ueber das GUI. Es liest den neuen Wert und modifiziert das Model.

In diesem Sinn sollte das GUI eine Referenz auf Karte oder Kartenstapel haben. Mit dieser Referenz kannst du dann das Kartenset aendern.

Sorry, ist halt etwas abstract mit dem Model, View (GUI), Controller, aber dies sind nun mal die Grundlagen der Programmierung.

Kurz und gut du musst in deinem GUI eine Referenz aufs Model halten, damit du das Model modifizieren und daraus Daten lesen kannst. Im Notfall kannst du auch eine statische Methode verwenden. Dies ist aber nicht gerade schoen.
 
Zuletzt bearbeitet:
ich habe auch schon überlegt, ob ich nicht eine statische Methode nehmen sollte, allerdings weiß ich da auch nicht wo ich die hinschreiben soll.

EDIT: Man, bist du geduldig!
Ich hätte bei nem Depp wie mir schon aufgegeben 😀
 
Zuletzt bearbeitet:
Ok, ich habe jetzt die Variable im KartenStapel eingebaut, danke für die gute Empfehlung!
Nun weiß ich aber trotzdem noch nicht, wie ich von der Options-GUI darauf zugreifen soll, schließlich gibt es keine Instanzen/Referenzen zwischen Optionen und KartenStapel!
LG, spinner

EDIT: Oder ist bei statischen Methoden garkeine Instanz/Referenz nötig?
 
Nun weiß ich aber trotzdem noch nicht, wie ich von der Options-GUI darauf zugreifen soll, schließlich gibt es keine Instanzen/Referenzen zwischen Optionen und KartenStapel!
Dann sorg dafür dass es Referenzen gibt 😉
Das über statische Methoden zu lösen ist unschön.
 
Hi,

ich würde das so machen

1. Erstelle Klasse OptionsUI die von mir aus von JDialog erbt
2. Sorge dafür dass diese Klasse Referenz auf das Modell hat.
3. Erstelle ComboBox mit 2 Elementen Default, Kawasaki
4. Wählt man ein Element aus und klickt auf Apply oder OK, soll das Modell über die Änderung informiert werden.
Code:
_model.setCardSet(_jComboBox.getSelectedItem.toString());

Im Modell könnte das dann so aussehen:
Java:
public void setCardSet(String setName){
       ImageLoader.getInstance().setCardSet(setName);//ImageLoader liefert die Bilder/Icons...
       _gui.refreshView(); //HauptGUI aktualisieren
}

ImageLoader hätte dann zB eine globale Variable
Code:
private String _currentCardSet;
also könntest du sowas machen:

Java:
public class ImageLoader {
    
    private static final String PATH = "files/icons/cardsets/";
    
    private static ImageLoader  _instance;
    private String              _currentCardSet;
    
    
    /**
     * Konstruktor.
     */
    private ImageLoader() {
        _currentCardSet = "Default";
    }
    
    /**
     * @return Instanz der Klasse.
     */
    public static final ImageLoader getInstance() {
        if (_instance == null) {
            _instance = new ImageLoader();
        }
        return _instance;
    }
    
    /**
     * Laedt ein Bild.
     * 
     * @param cardName
     *            Dateiname des Bildes.
     * @return Bild als {@link ImageIcon}
     */
    public ImageIcon createIcon(String cardName) {
        URL url = ClassLoader.getSystemResource(PATH + _currentCardSet + "/" + cardName);
        if (url != null) {
            return new ImageIcon(url);
        }
        return null;
    }
    
    /**
     * Gibt currentCardSet zurueck
     * 
     * @return the currentCardSet
     */
    public String getCurrentCardSet() {
        return _currentCardSet;
    }
    
    /**
     * Aendert currentCardSet
     * 
     * @param currentCardSet
     *            neuer Wert
     */
    public void setCurrentCardSet(String currentCardSet) {
        _currentCardSet = currentCardSet;
    }

}

Gruß
 

Zurück
Oben