Ereignisbehandlung in einem Ereignismodell

morphi79

Erfahrenes Mitglied
Ich soll eine Klasse ColorChooser bauen, die ein Fenster erzeugt, an dessen oberen Rand sich ein Auswahlfeld (Choice) befindet. In diesem Auswahlfeld kann der Benutzer eine von mehren angebotenen Farben auswählen. Meine bisher erstellte Klasse enthält die Gestaltung der Oberfläche. Diese Klasse soll nun durch die Behandlung von Ereignissen mit Funktionalität gefüllt. Die Auswahl einer Farbe in dem Auswahlfeld soll dazu führen, dass der Hintergrund des Fensters seine Farbe entsprechend ändert. Dazu muss, wenn ein Eintrag der Farbliste ausgewählt wurde, dessen Position in der Liste ermittelt und die
entsprechende Farbe aus dem Array colors als Hintergrundfarbe eingesetzt werden.
Außerdem soll das Programm mit System.exit(0) abgebrochen werden, wenn der
Benutzer das Schließen des Fensters veranlasst.


Dazu muss ich zwei innere Klassen WindowHandler und ItemHandler erstellen, die die Listener-Interfaces für die beiden angesprochenen Ereignisarten implementieren. Ich soll dabei von Adapter-Klassen Gebrauch machen, wo dies sinnvoll ist. In jeder dieser inneren Klassen soll die entsprechende Methode des Interfaces so überschrieben werden,
dass die gewünschten Reaktionen auf Aktionen des Benutzers erfolgen. Zusätzlich
müssen dafür im Konstruktor der Klasse ColorChooser Instanzen dieser inneren
Klassen angelegt und den entsprechenden Objekten als Listener hinzugefügt
werden. Die notwendigen Ergängzungen an den mit entsprechenden Kommentaren markierten Stellen im Quelltext der Klasse muss sollte ich ebenfalls noch vornehmen.


Einem Objekt vom Typ Choice kann ein ItemListener hinzugefügt werden. Das
Interface ItemListener deklariert eine Methode itemStateChanged(), deren Argument
ein ItemEvent ist und die aufgerufen wird, wenn ein neuer Eintrag in der Auswahlliste
ausgewählt wird. Aus einem Event-Objekt kann mit der Methode getSource() die
auslösende Komponente (z.B. eine Referenz auf die Auswahlliste) ermittelt werden.
Ein Objekt vom Typ Choice besitzt eine Methode getSelectedIndex(), die den Index
des gewählten Eintrags in der Liste zurückliefert.

Zum Ändern der Hintergrundfarbe des Fensters kann die Methode setBackground()
der Klasse Frame verwendet werden. Ihr einziges Argument ist eine Farbangabe wie
sie in dem Array colors abgelegt ist.

Nun habe ich eine Klasse schon erstellt. Leider komm ich im Moment nicht weiter.

Code:
import java.awt.*;
import java.awt.event.*;
public class ColorChooser {
	/** Attribute */
	private Frame frame;
	private Choice choice;
	
	private Color[] colors = { Color.black, Color.blue, Color.cyan,
		  Color.darkGray, Color.gray, Color.green,
		  Color.lightGray, Color.magenta, Color.orange, 
		  Color.pink, Color.red, Color.white, Color.yellow
	};
	
	private String[] colorNames = { "Schwarz", "Blau", "Cyan",
		"Dunkelgrau", "Grau", "Grün",
		"Hellgrau", "Magenta", "Orange", 
		"Pink", "Rot", "Weiß", "Gelb"
	};
	
	/** Konstruktor */
	public ColorChooser() {
		frame = new Frame("Color Chooser");
 
		choice = new Choice();
		for(int i = 0; i < colorNames.length; i++) {
	 choice.add(colorNames[i]);
		}
 
		/* Hier sollte die Klasse ItemHandler als
		   ItemListener hinzugefügt werden. Die Klasse ItemHandler würde später 
		   erstellt werden. */
		
		frame.add(choice, BorderLayout.NORTH);
 
 /* ToDo:	Hier sollte ein Objekt der Klasse WindowHandler als
		 * WindowListener erstellt werden. Die Klasse WindowHandler sollte späte 
			erstellt werden. */
		
		frame.setSize(300, 300);
		frame.setVisible(true);
	}
	
	/** Innere Klasse WindowHandler */
	
	/* ToDo:	Hier Klasse WindowHandler. Implemtation
	 * der Methode windowClosing(). */
	
	/** Innere Klasse ItemHandler */
	
	/* ToDo:	Hier die Klasse ItemHandler. Implementation
	 * der Methode itemStateChanged(). Zusätzliche 
	 * Änderung der Auswahl heraus, welcher Eintrag ausgewählt wurde (mit
	 * den Methoden getSource() und getSelectedIndex()) und Änderung der
	 * Hintergrundfarbe des Fensters entsprechend der Auswahl. */
	
	public static void main(String args[]) {
 ColorChooser c = new ColorChooser();
	}
}

kann mir jemand dabei helfen, diese Klasse so zu verändern, dass ich die Aufgabenstellung lösen kann
 

elmato

Erfahrenes Mitglied
Einem Objekt vom Typ Choice kann ein ItemListener hinzugefügt werden. Das
Interface ItemListener deklariert eine Methode itemStateChanged(), deren Argument
ein ItemEvent ist und die aufgerufen wird, wenn ein neuer Eintrag in der Auswahlliste
ausgewählt wird. Aus einem Event-Objekt kann mit der Methode getSource() die
auslösende Komponente (z.B. eine Referenz auf die Auswahlliste) ermittelt werden.
Ein Objekt vom Typ Choice besitzt eine Methode getSelectedIndex(), die den Index
des gewählten Eintrags in der Liste zurückliefert.
damit hast du doch schon fast alle was du wissen musst um diese Aufgabe zu realisieren... was ist den eigentlich genau deine frage? Den (Haus)Aufgaben soll man soweit wie moeglich selber loesen, also versuch mal eine innere klasse zu implementieren und wenn du dann nicht weiter kommst poste doch mal deine versuche hier...
 

morphi79

Erfahrenes Mitglied
wäre dann das korrekt so?


Code:
import java.awt.*;
import java.awt.event.*;
public class ColorChooser {
	/** Attribute */
	private Frame frame;
	private Choice choice;
	
	private Color[] colors = { Color.black, Color.blue, Color.cyan,
		  Color.darkGray, Color.gray, Color.green,
		  Color.lightGray, Color.magenta, Color.orange, 
		  Color.pink, Color.red, Color.white, Color.yellow
	};
	
	private String[] colorNames = { "Schwarz", "Blau", "Cyan",
		"Dunkelgrau", "Grau", "Grün",
		"Hellgrau", "Magenta", "Orange", 
		"Pink", "Rot", "Weiß", "Gelb"
	};
	
	/** Konstruktor */
	public ColorChooser() {
		frame = new Frame("Color Chooser");
 
		choice = new Choice();
		for(int i = 0; i < colorNames.length; i++) {
	 choice.add(colorNames[i]);
		}
 
		/* ToDo:	Fügen Sie ein Objekt der Klasse ItemHandler als
		 * ItemListener hinzu. Die Klasse ItemHandler erstellen sie
		 * später. */
		
		frame.add(choice, BorderLayout.NORTH);
 
 /* ToDo:	Fügen Sie ein Objekt der Klasse WindowHandler als
		 * WindowListener hinzu. Die Klasse WindowHandler erstellen sie
		 * später. */
		
		frame.setSize(300, 300);
		frame.setVisible(true);
	}
	
	/** Innere Klasse WindowHandler */
	
  /* ToDo:	Erstellen Sie hier die Klasse WindowHandler. Implementieren
	 * Sie darin die Methode windowClosing(). */
 
  class WindowHandler extends WindowAdapter {
   private Counter counter;
	 
   public WindowHandler(Counter c) {
	  this.counter = c;
   }
	  
   public void windowClosing(WindowEvent e) {
	  counter.getFrame().setVisible(false);
	  counter.getFrame().dispose();
	  System.out.println("GUI exiting...");
	  System.exit(0);
   }
} 
	
	/** Innere Klasse ItemHandler */
	
	/* ToDo:	Erstellen Sie hier die Klasse ItemHandler. Implementieren
	 * Sie darin die Methode itemStateChanged(). Finden Sie nach einer
	 * Änderung der Auswahl heraus, welcher Eintrag ausgewählt wurde (mit
	 * den Methoden getSource() und getSelectedIndex()) und ändern Sie die
	 * Hintergrundfarbe des Fensters entsprechend. */
	
	public static void main(String args[]) {
 ColorChooser c = new ColorChooser();
	}
}
 

torsch2711

Erfahrenes Mitglied
Hi schon mal ein brauchbarer anfang. allerdings versteh ich jetzt nicht ganz was bei dem WindowHandler der integer wert counter bedeuten soll, bzw. wofür du ihn benötigst.

eine gute einführung in die Implementation der ItemListener findest du hier:

http://www.ictp.trieste.it/~manuals/programming/Java/tutorial/uiswing/events/itemlistener.html


Da hier keine konkreten fragen aufgeführt sind und ich keine Lust habe den kompletten Source für dich zu erstellen (hat auch keinen Lern-Effekt für dich), denke ich das Dir obiger Link schon gut weiterhilft.


Gruss,

Torsten