Color Chooser

morphi79

Erfahrenes Mitglied
Hallo Jungs und Mädels,

ich habe ein kleines Problemchen. Ich habe im Anfang dieses Jahres einen Kurs für JAVA gemacht und diesen auch bestanden. Nun muss ich noch eine kleine Projektarbeit machen. Leider habe ich schon wieder soooo viel vergessen seit diesem Kurs. Ich komme leider mit einem Teil der Arbeit überhaupt nicht klar. Entweder habe ich da nicht aufgepasst oder wird haben es nicht durchgenommen. Eher denke ich aber mal das erstere :-(.......
Aber ich hoffe, ihr könnt mir evtl. bei diesem Teil der Aufgabe helfen, es wäre wirklich wichtig.... so und nun mal zum kleingedruckten:

Es ist so, dass eine Klasse ColorChooser, die ein Fenster erzeugt, an dessen oberen Rand sich ein Auswahlfeld (Choice) befindet vorgegeben ist. Diese sieht so aus:
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(). */
 
	/** 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();
	}
}

Bisher enthält die Klasse nur die Gestaltung der Oberfläche. Ich soll jetzt die vorgegebene Klasse durch die Behandlung von Ereignissen mit Funktionalität füllen. 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.

Die Klassen sind mir ebenfalls schon benannt. Es sollen zwei innere Klassen WindowHandler und ItemHandler, die die Listener-Interfaces für die beiden angesprochenen Ereignisarten implementieren beeinhalten. Zusätzlich muss ich von 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.

Dem vorhandenen Objekt vom Typ Choice kann ja bereits 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 ich doch die Methode setBackground() der Klasse Frame verwenden, oder? Ihr einziges Argument ist eine Farbangabe wie sie in dem Array colors abgelegt ist.

Bitte um Hilfe....
 
Hi!
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]);
        }

        // ItmeListener adden
        choice.addItemListener(new ItemHandler());
        frame.add(choice, BorderLayout.NORTH);

        // WindowsListener adden
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        // Damit gleich zu Anfang die richtige Farbe gesetzt wird
        frame.setBackground(colors[0]);
        
        frame.setSize(300, 300);
        frame.setVisible(true);
    }

    /** Innere Klasse WindowHandler */
    /** Siehe oben (Anonyme Klasse) */ 
        
    /** Innere Klasse ItemHandler */
    private class ItemHandler implements ItemListener {

        public void itemStateChanged(ItemEvent e) {
            Choice choice = (Choice) (e.getSource());
            frame.setBackground(colors[choice.getSelectedIndex()]);
        }

    }

    public static void main(String args[]) {
        ColorChooser c = new ColorChooser();
    }

}

MfG
Sebastian
 
Soll heißen, dass ich für den WindowListener nicht ne Memberclass implementiert hab, sondern es mit einer anonymen Klasse gemacht habe:

Code:
frame.addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
      System.exit(0);
   }
});

Laut Aufgabenstellung war eher folgendes verlangt:

Code:
...

// WindowsListener adden
frame.addWindowListener(new WindowHandler());

...

/** Innere Klasse WindowHandler */
private class WindowHandler extends WindowAdapter{
   public void windowClosing(WindowEvent e) {
      System.exit(0);
   }
}

...

MfG
Sebastian
 
ähm.... warum lässt sich dieses dumme teil nicht kompilieren? Ich kann nicht entdecken, woran es liegt.... bin ich heute noch nicht ausgeschlafen oder was?


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]);        }        // ItmeListener adden        choice.addItemListener(new ItemHandler());        frame.add(choice, BorderLayout.NORTH);     	// WindowsListener adden	frame.addWindowListener(new WindowHandler());            }        });        // Damit gleich zu Anfang die richtige Farbe gesetzt wird        frame.setBackground(colors[0]);                frame.setSize(300, 300);        frame.setVisible(true);    }   	/** Innere Klasse WindowHandler */	private class WindowHandler extends WindowAdapter{ 	public void windowClosing(WindowEvent e) {	System.exit(0);   		}	}            /** Innere Klasse ItemHandler */    private class ItemHandler implements ItemListener {        public void itemStateChanged(ItemEvent e) {            Choice choice = (Choice) (e.getSource());            frame.setBackground(colors[choice.getSelectedIndex()]);        }    }    public static void main(String args[]) {        ColorChooser c = new ColorChooser();    }}
 
Also:
1. Ist es ne Frechheit so nen Code ins Netz zu stellen. Du könntest das ganze ruhig mal formatieren.
2. Wie wäre es, wenn du mal ne IDE (Eclipse z.B.) benutzt? Die würde dir sofort anzeigen, dass du da totalen Bockmist mit deinen ganzen geschweiften Klammern gemacht hast!
3. So sollte es dann aussehen und damit auch kompilierbar sein.
Code:
package de.tutorials;

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]);
        // ItmeListener adden
        choice.addItemListener(new ItemHandler());
        frame.add(choice, BorderLayout.NORTH);
        // WindowsListener adden
        frame.addWindowListener(new WindowHandler());

        // Damit gleich zu Anfang die richtige Farbe gesetzt wird
        frame.setBackground(colors[0]);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }

    /** Innere Klasse WindowHandler */
    private class WindowHandler extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }

    /** Innere Klasse ItemHandler */
    private class ItemHandler implements ItemListener {
        public void itemStateChanged(ItemEvent e) {
            Choice choice = (Choice) (e.getSource());
            frame.setBackground(colors[choice.getSelectedIndex()]);
        }
    }

    public static void main(String args[]) {
        ColorChooser c = new ColorChooser();
    }

}

MfG
Sebastian
 
Zurück