Java/Tutorials/Entwicklung eines einfachen Karteneditors IV/Kapitel 2

Aus Scientia
Wechseln zu: Navigation, Suche

Nun Legen wir uns für den Maker einen Dialog an, wir nennen die Klasse EventDialog und erben von JFrame, damit wir es gleich als Fenster anzeigen lassen können. Weiterhin implementieren wir das ActionListener Interface, damit wir beim drücken auf Okay, ein Event erstellen können.


public class EventDialog extends JFrame implements ActionListener{
	@Override
	public void actionPerformed(ActionEvent e) {
 
	}
}


Was brauchen wir alles für unser EventDialog, einmal eine Textfläche wo wir unseren Scriptcode einfügen und eine Selektbox/Combobox wo wir den AuslöseTyp wählen können. Natürlich brauchen wir auch noch unseren Okay-Button.

public class EventDialog extends JFrame implements ActionListener{
        JTextArea script=new JTextArea();
	JComboBox auslöseTyp = new JComboBox(new String[] {"Tastatureingabe","Held berührt Event"});
	JButton okay = new JButton("Ok");
 
	@Override
	public void actionPerformed(ActionEvent e) {
 
	}
}

Damit wir nicht 2 Dialog bauen müssen für das erstellen und Bearbeiten von Events passen wir unseren Konstruktor so an, das wir als Parameter des Konsturktors die eigentschaften der Event-Klasse haben, also Quelltext des Script, auslöseTyp und Position des Events. Daher legen wir erstmal eine Klassenvariable position vom Typ Point an und anschließend weisen wir den Parameter die jeweilige Klassenvariable zu. Dies geht mittels setText der JTextArea Klasse, setSelectedIndex der JComboBox-Klasse und eine einfache Zuweissung bei der Point Klasse. Und wie bei jeden unseren bisherigen Klassen, übergeben wir der Klasse die Klasse KartenFenster und legen hierfür eine Klassenvariable an.


public class EventDialog extends JFrame implements ActionListener{
	KartenFenster fenster;
        JTextArea script=new JTextArea();
	JComboBox auslöseTyp = new JComboBox(new String[] {"Tastatureingabe","Held berührt Event"});
	JButton okay = new JButton("Ok");
	Point position;
 
	public EventDialog(String quelltext, int auslösezahl, Point pos, KartenFenster f)
	{
		script.setText(quelltext);
		auslöseTyp.setSelectedIndex(auslösezahl);
		position=pos;
		fenster=f;
        }
 
	@Override
	public void actionPerformed(ActionEvent e) {
 
	}
}


Im nächsten schritt setzen wir erstmal unseren Swing-Komponenten eine Feste größe, damit wir es über FlowLayout und GridLayout teilweise gut darstellen können. Unseren Ok-Button weisen wir einen ActionListener zu und zwar die Klasse EventDialog selbst, da wir ActionListener implementiert haben. Wenn wir dies gemacht haben, legen wir ein JPanel an mit den namen hauptpanel und setzen als Layout, das GridLayout. Die Parameter 0 bedeuted, das wir nicht wissen wieviele Zeilen unser Gitter(Grid) hat. die 1 bedeutet das wir nur 1 Spalte haben.

public class EventDialog extends JFrame implements ActionListener{
	KartenFenster fenster;
        JTextArea script=new JTextArea();
	JComboBox auslöseTyp = new JComboBox(new String[] {"Tastatureingabe","Held berührt Event"});
	JButton okay = new JButton("Ok");
	Point position;
 
	public EventDialog(String quelltext, int auslösezahl, Point pos, KartenFenster f)
	{
		script.setText(quelltext);
		auslöseTyp.setSelectedIndex(auslösezahl);
		position=pos;
		fenster=f;
 
		script.setPreferredSize(new Dimension(300,100));
		auslöseTyp.setPreferredSize(new Dimension(280,30));
 
		okay.addActionListener(this);
		JPanel hauptpanel=new JPanel();
		hauptpanel.setLayout(new GridLayout(0,1));
        }
 
	@Override
	public void actionPerformed(ActionEvent e) {
 
	}
}


Nun legen wir für jede Swing-Komponente ein JPanel an und setzen als Layout FlowLayout. Für die Beschreibungen verwenden wir die Klasse JLabel. Anschließend fügen wir jedes JPanel unserem Hauptpanel hinzu. Weiterhin fügen wir dann unser hauptpanel dem JFrame, also unseren Fenster hinzu.


public class EventDialog extends JFrame implements ActionListener{
	KartenFenster fenster;
        JTextArea script=new JTextArea();
	JComboBox auslöseTyp = new JComboBox(new String[] {"Tastatureingabe","Held berührt Event"});
	JButton okay = new JButton("Ok");
	Point position;
 
	public EventDialog(String quelltext, int auslösezahl, Point pos, KartenFenster f)
	{
		script.setText(quelltext);
		auslöseTyp.setSelectedIndex(auslösezahl);
		position=pos;
		fenster=f;
 
		script.setPreferredSize(new Dimension(300,100));
		auslöseTyp.setPreferredSize(new Dimension(280,30));
 
		okay.addActionListener(this);
		JPanel hauptpanel=new JPanel();
		hauptpanel.setLayout(new GridLayout(0,1));
		JPanel panel1 = new JPanel();
		panel1.setLayout(new FlowLayout());
		panel1.add(new JLabel("Script:"));
		panel1.add(script);		
 
		JPanel panel2 = new JPanel();
		panel2.setLayout(new FlowLayout());
		panel2.add(new JLabel("Auslöse-Typ:"));
		panel2.add(auslöseTyp);
		panel2.add(okay);
 
		JPanel panel3 = new JPanel();
		panel3.setLayout(new FlowLayout());
		panel3.add(okay);
 
		hauptpanel.add(panel1);
		hauptpanel.add(panel2);
		hauptpanel.add(panel3);
 
		add(hauptpanel);
        }
 
	@Override
	public void actionPerformed(ActionEvent e) {
 
	}
}

Unser EventDialog sieht zwar nicht schön aus, dies kann aber jeder nach belieben selbst gestalten. KartenEditorEventDialog.png

Nun kommen wir zur funktionalität in unserer Methdoe actionPerform. Fragen wir nun die Klassenvariablen ab nach dem Aktuellen Inhalt und erzeugen damit eine Event Klasse, die wir dann unseren Aktuellen-Klasse hinzufügen.

public class EventDialog extends JFrame implements ActionListener{
 
	KartenFenster fenster;
	JTextArea script=new JTextArea();
	JComboBox auslöseTyp = new JComboBox(new String[] {"Tastatureingabe","Held berührt Event"});
	JButton okay = new JButton("Ok");
	Point position;
 
	public EventDialog(String quelltext, int auslösezahl, Point pos, KartenFenster f)
	{
		script.setText(quelltext);
		auslöseTyp.setSelectedIndex(auslösezahl);
		position=pos;
		fenster=f;
 
		script.setPreferredSize(new Dimension(300,100));
		auslöseTyp.setPreferredSize(new Dimension(280,30));
 
		okay.addActionListener(this);
 
		JPanel hauptpanel=new JPanel();
		hauptpanel.setLayout(new GridLayout(0,1));
 
		JPanel panel1 = new JPanel();
		panel1.setLayout(new FlowLayout());
		panel1.add(new JLabel("Script:"));
		panel1.add(script);		
 
		JPanel panel2 = new JPanel();
		panel2.setLayout(new FlowLayout());
		panel2.add(new JLabel("Auslöse-Typ:"));
		panel2.add(auslöseTyp);
		panel2.add(okay);
 
		JPanel panel3 = new JPanel();
		panel3.setLayout(new FlowLayout());
		panel3.add(okay);
 
		hauptpanel.add(panel1);
		hauptpanel.add(panel2);
		hauptpanel.add(panel3);
 
		add(hauptpanel);
	}
 
 
	@Override
	public void actionPerformed(ActionEvent e) {
		String quelltext = script.getText();
		int typ = auslöseTyp.getSelectedIndex();
		Point pos = new Point(position.x, position.y);
 
		Event event=new Event(quelltext, typ, pos);
		fenster.aktuelleKarte.events.add(event);
	}
}