Code durch eigenes Frame pausieren (ähnlich JDialog)

twinflyer

Mitglied
Hi Leute,
ich habe eine Frage zum Thema JDialogs, bzw. wie ich die Codeausführung pausieren kann, bis der "Dialog" wieder geschlossen wurde. Hintergrund ist folgender:

Ich bin momentan dabei ein tilebasiertes 2D Spiel inklusive Map und Storyeditor zu schreiben. Grafiken können selbst erstellt und Anderen online zur Verfügung gestellt werden.
Innerhab des Map-Editors hat man eine schöne Übersicht aller vorhandenen Bodentexturen (Tiles), allerdings ist es an manchen Stellen nötig ein einzenes Tile in einem Dialog auswählen zu können:
Der Editor soll später eine "Autofringe" Funktion bekommen. Das heißt übergänge von z.B. Wasser auf Land aus den vorhandenen Tiles automatisch erstellen (natürlich kennt er dafür die entsprechenden 12 Übergangstiles). Ein Kontextmenü fordert dazu auf, zwei Tiles (die, zwischen denen der Übergang generiert werden soll) zu wählen. Dabei wäre folgendes sehr praktisch:

Ich benutzte soetwas wie
Java:
Tile tile1 = TilePicker.pick(TilePack pack)

wird dieser Code ausgeführt, öffnet sich der Dialog, auf dem ich das gewünschte Tile aus einer Liste wählen kann. Beim Anklicken wird das gewählte Tile an tile1 zurück gegeben. So funktioniert das ja auch bei JOptionPanes oder ähnlichem.

Meine Frage:
Kann ich diese "Code-Sperre" irgendwie selbst schreiben, oder wäre es das Einfachste meinen TilePick-Dialog von JDialog erben zu lassen, bzw. wie bekomme ich das dann hin? Habe leider noch nichts derartiges gemacht und werde aus den paar Infos die Google mir ausspuckt nicht so richtig schlau :/
Habt ihr da irgendwie einen Anhaltspunkt für mich, ich bin durchaus gewillt selbst zu lernen, das hat bis Dato eigentlich auch wunderbar funktioniert 😉

Gruß Max
 
Java:
Tile tile1 = TilePicker.pick(TilePack pack)

Sowas, dass vergleichbar ist mit

Java:
Object o = JOptionPane.showInputDialog(...);

kann man verwenden, würde ich aber nicht.

Ich würde eher sowas machen

Java:
public class TileDialog extends JDialog implements ActionListener {
  private final IModel model;

  public Tile(Frame owner, IModel model){
    super(owner, true);
    this.model = model;
    ...
  }

  public void actionPerformed(ActionEvent e) {
    if(selectedTile != null){
      model.setTile(selectedTile);  
    }else{
      // nothing to Do
    }
    //Dialog schließen
    this.dispose();
  }
}

Bei dem ersten Ansatz, hat man die Schwierigkeit wenn nichts/null ausgewählt wird, daß man dann die Fehlerbehandlung an einer Stelle machen muß, die den restlichen Code sehr komplex machen kann.

Bei der Variante mit dem setter im JDialog, bekommt man IMHO einfacher ein besseres Ergebnis.
Wird der setter im Model aufgerufen, dann weiß das Model das es sich geändert hat und benachrichtigt die View die Änderungen wiederzugeben.

Insbesondere wenn man sich an MVC orientiert ist es gut wenn das Model recht unabhängig vom View- Code bleibt und nur über PubSub mit der View komuniziert.
 
Danke euch, ich habe es hinbekommen 🙂

Ich hab da wohl einfach deutlich zu kompliziert gedacht, das Stichwort "modal" hat tatsächlich gereicht. Ich habe jetzt allerdings doch die Form:
Java:
Tile tile1 = TilePicker.pick(TilePack pack)
Da es den Fall, dass nichts ausgewählt wird quasi nicht gibt (bzw. ich das schließen des Fensters einfach verboten habe 😉 ) weil man, wenn man nichts auswählt den nächsten Schritt eh nicht machen könnte.

Falls es euch interessiert könnt ihr gerne mal auf meinem Blog vorbeischauen: Updates MineForce.de | Feel the Force

Über ein Kommentar oder Tipps freue ich mich natürlich immer 😀

Gruß twinflyer
 

Zurück
Oben