Java/Tutorials/Karteneditor Kapitel 9

Aus Scientia
Wechseln zu: Navigation, Suche

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, weil das eigentlich anlegen einer neuen Karte ist nicht sehr viel, 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, das beim erstellen einer neuen Karte man im KartenFenster nichts mehr ändern kann.Da wir ein JDialog verwenden übergeben wir ein übergeordnetes Fenster an dieser und vergeben auch gleich einen Titel. Dies erfolgt alles in der super()-Anweisung. Diese Ruft ein übergeordneten Konstrutkor 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 Namen angabe belassen). Daher wir brauchen insgesamt 4 JLabel (für Beschreibung der Eingabe) und 4 JTextField für die eigentliche eingabe. Sowie ein Okay-Button von Type 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 unseren JDialog hinzu? Wir werden in diesen Beispiel ein FlowLayout verwenden und setzen dies mit der setLayout()-Methide. Und um Sicher zu gehen das alle Label und Textfelder gleich groß sind, legen wir eine Variable Dimension an. wo wir 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, weil sonst das FlowLayout dafür sorgt das 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 das unsere Elemente schön untereinander Angeordnet werden. Anschließend fügen wir alle Komponenten

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 auf den Button "okay" eine Methode mit den Namen erstelleKarte() Aufruft.


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 lasse, aber zuerst müssen wir die Werte aus den JTextField hohlen, dies erfolgt mit der Methode getText(). Da wir aber für die Karten Breite und Höhe einen Intergerwert benötigen müssen wir erst den String in einen Interwert Umwandeln, dies erfolgt mit der Klasse Interger und mit der Methode parse(). Nach dem wir alle benötigten Werte haben, überschreiben wir die aktuelleKarte aus der KartenFenster-Klasse in dem wir einfach ein neues Karten-Objekt erzeugen. Damit auch unsere Palette und Karten Ansicht auch aktuallisiert werden, rufen wir bei beiden die Methode repaint() auf. Aber zufvor rufen wir noch die Methode changeKarte() von unserer KartenAnsicht-Klasse auf.

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.palette.repaint();
		fenster.ansicht.repaint();
	}
}

Damit wir den Dialog auch aufrufen können von unserer Menü aus, schreiben wir in

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()
	{
 
	}
}