Java/Tutorials/Karteneditor Kapitel 9
In diesen Abschnitt behandeln wir, wie wir eine Neue Karte anlegen. Der größte Teil wird aber der Dialog für das Erstellen von Karten ausmachen, denn das eigentliche Anlegen einer neuen Karte ist nicht viel Arbeit, aber für den Dialog müssen wir einiges erstellen. Als erstes legen wir uns eine Klasse KartenDialog an. Diese leiten wir von JDialog ab und wie immer übergeben wir die KartenFenster-Klasse. Wir verwenden ein JDialog aus dem Grund, dass beim Erstellen einer neuen Karte man im KartenFenster nichts mehr ändern kann.Da wir ein JDialog verwenden übergeben wir ein übergeordnetes Fenster an diesen und vergeben auch gleich einen Titel. Dies erfolgt alles in der super()-Anweisung. Diese ruft einen übergeordneten Konstruktor von JDialog auf.
public class KartenDialog extends JDialog{ KartenFenster fenster; public KartenDialog(KartenFenster kfenster) { super(kfenster, "Karte erstellen"); fenster=kfenster; } }
Was genau brauchen wir alles? Wir benötigen die Höhe und Breite der Karte, sowie den Kartennamen und den Tileset-Dateinamen (dies kann man eigentlich geschickter einbauen, aber wir wollen es erstmal nur bei der Namensangabe belassen). Wir brauchen daher insgesamt 4 JLabel (für die Beschreibung der Eingabe) und 4 JTextField für die eigentliche Eingabe, sowie ein Okay-Button vom Typ JButton.
public class KartenDialog extends JDialog{ KartenFenster fenster; JTextField kartenName=new JTextField(); JTextField kartenBreite=new JTextField(); JTextField kartenHöhe=new JTextField(); JTextField tilesetDateiname=new JTextField(); JLabel name=new JLabel("Name:"); JLabel dateiname=new JLabel("Tileset:"); JLabel breite=new JLabel("Karten Breite:"); JLabel höhe=new JLabel("Karten Höhe:"); JButton okay=new JButton("okay"); public KartenDialog(KartenFenster kfenster) { super(kfenster, "Karte erstellen"); fenster=kfenster; } }
Nun haben wir alle benötigten Komponenten, nur wie fügen wir diese unserem JDialog hinzu? Wir werden in diesem Beispiel ein FlowLayout verwenden und setzen dies mit der setLayout()-Methode. Um sicher zu gehen, dass alle Label und Textfelder gleich groß sind, legen wir eine Variable Dimension an. in der wir die Breite von 100 und die Höhe von 20 eintragen. Anschließend setzen wir alle JTextField und JLabel auf diese Größe, mit der Methode setPreferredSize(). Das müssen wir machen, da sonst das FlowLayout dafür sorgt, dass unser JTextField gerade mal 1px breit ist und dies ist für eine Eingabe etwas schwierig. Weiterhin setzen wir die Größe unseres JDialog auf 250x200, so dass unsere Elemente schön untereinander angeordnet werden. Anschließend fügen wir alle Komponenten zusammen.
public class KartenDialog extends JDialog{ KartenFenster fenster; JTextField kartenName=new JTextField(); JTextField kartenBreite=new JTextField(); JTextField kartenHöhe=new JTextField(); JTextField tilesetDateiname=new JTextField(); JLabel name=new JLabel("Name:"); JLabel dateiname=new JLabel("Tileset:"); JLabel breite=new JLabel("Karten Breite:"); JLabel höhe=new JLabel("Karten Höhe:"); JButton okay=new JButton("okay"); public KartenDialog(KartenFenster kfenster) { super(kfenster, "Karte erstellen"); fenster=kfenster; Dimension dim=new Dimension(100, 20); kartenBreite.setPreferredSize(dim); kartenHöhe.setPreferredSize(dim); kartenName.setPreferredSize(dim); tilesetDateiname.setPreferredSize(dim); höhe.setPreferredSize(dim); breite.setPreferredSize(dim); name.setPreferredSize(dim); dateiname.setPreferredSize(dim); setSize(250,200); setLayout(new FlowLayout()); add(name); add(kartenName); add(breite); add(kartenBreite); add(höhe); add(kartenHöhe); add(dateiname); add(tilesetDateiname); add(okay); setVisible(true); } }
Nun benötigen wir wieder ein ActionListener, womit wir beim Betätigen des Buttons "okay" eine Methode mit den Namen erstelleKarte() aufrufen.
public class KartenDialog extends JDialog{ KartenFenster fenster; JTextField kartenName=new JTextField(); JTextField kartenBreite=new JTextField(); JTextField kartenHöhe=new JTextField(); JTextField tilesetDateiname=new JTextField(); JLabel name=new JLabel("Name:"); JLabel dateiname=new JLabel("Tileset:"); JLabel breite=new JLabel("Karten Breite:"); JLabel höhe=new JLabel("Karten Höhe:"); JButton okay=new JButton("okay"); public KartenDialog(KartenFenster kfenster) { super(kfenster, "Karte erstellen"); fenster=kfenster; Dimension dim=new Dimension(100, 20); kartenBreite.setPreferredSize(dim); kartenHöhe.setPreferredSize(dim); kartenName.setPreferredSize(dim); tilesetDateiname.setPreferredSize(dim); höhe.setPreferredSize(dim); breite.setPreferredSize(dim); name.setPreferredSize(dim); dateiname.setPreferredSize(dim); okay.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { erstelleKarte(); } }); setSize(250,200); setLayout(new FlowLayout()); add(name); add(kartenName); add(breite); add(kartenBreite); add(höhe); add(kartenHöhe); add(dateiname); add(tilesetDateiname); add(okay); setVisible(true); } public void erstelleKarte() { } }
Nun müssen wir nur noch in der erstellten Methode eine Karte erstellen lassen. Aber zuerst müssen wir die Werte aus dem JTextField holen. Dies erfolgt mit der Methode getText(). Da wir aber für die Kartenbreite und -höhe einen Integerwert benötigen, müssen wir erst den String in einen Integerwert umwandeln. Dies erfolgt mit der Klasse Integer und mit der Methode parse(). Nachdem wir alle benötigten Werte haben, überschreiben wir die aktuelleKarte aus der KartenFenster-Klasse, indem wir einfach ein neues Karten-Objekt erzeugen. Damit auch unser KartenFenster mit allen Komponenten aktualisiert wird, rufen wir zuerst die Methode changeKarte() von unserer KartenAnsicht-Klasse auf. Anschließend rufen wir bei jeder Swing-Komponente die repaint()-Methode auf. Zu guter Letzt wollen wir das sich das Dialogfenster wieder schließt, darum rufen wir dispose() auf, was ebendas macht.
public class KartenDialog extends JDialog{ KartenFenster fenster; JTextField kartenName=new JTextField(); JTextField kartenBreite=new JTextField(); JTextField kartenHöhe=new JTextField(); JTextField tilesetDateiname=new JTextField(); JLabel name=new JLabel("Name:"); JLabel dateiname=new JLabel("Tileset:"); JLabel breite=new JLabel("Karten Breite:"); JLabel höhe=new JLabel("Karten Höhe:"); JButton okay=new JButton("okay"); public KartenDialog(KartenFenster kfenster) { super(kfenster, "Karte erstellen"); fenster=kfenster; Dimension dim=new Dimension(100, 20); kartenBreite.setPreferredSize(dim); kartenHöhe.setPreferredSize(dim); kartenName.setPreferredSize(dim); tilesetDateiname.setPreferredSize(dim); höhe.setPreferredSize(dim); breite.setPreferredSize(dim); name.setPreferredSize(dim); dateiname.setPreferredSize(dim); okay.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { erstelleKarte(); } }); setSize(250,200); setLayout(new FlowLayout()); add(name); add(kartenName); add(breite); add(kartenBreite); add(höhe); add(kartenHöhe); add(dateiname); add(tilesetDateiname); add(okay); setVisible(true); } public void erstelleKarte() { int breite=Integer.parseInt(kartenBreite.getText()); int höhe=Integer.parseInt(kartenHöhe.getText()); int[][] karte= new int[breite][höhe]; String name=kartenName.getText(); String tileset=tilesetDateiname.getText(); fenster.aktuelleKarte=new Karte(karte, tileset, name); fenster.ansicht.changeKarte(); fenster.palette.repaint(); fenster.ansicht.repaint(); fenster.ansicht.scroll.repaint(); fenster.repaint(); dispose(); } }
Damit wir den Dialog auch von unserem Menü aus aufrufen können, schreiben wir in die KartenMenü-Klasse folgendes:
public class KartenMenü extends JMenuBar{ KartenFenster fenster; JMenu datei=new JMenu("Datei"); JMenuItem neu=new JMenuItem("Neue Karte"); JMenuItem speichern=new JMenuItem("Karte Speichern"); JMenuItem laden=new JMenuItem("Karte Laden"); public KartenMenü(KartenFenster kfenster) { fenster=kfenster; neu.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { neu(); } }); laden.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { laden(); } }); speichern.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { speichern(); } }); datei.add(neu); datei.add(speichern); datei.add(laden); add(datei); } public void neu() { new KartenDialog(fenster); } public void laden() { } public void speichern() { } }