Problem mit Choice



  • Hallo Leute

    Ich versuche mir ein kleines Zeichenprogramm zu schreiben und benutze die Komponente Choice zur Farbauswahl. Ich registriere einen ItemListener um zu sehen, wann sich die Farbe ändert. Bei Abfrage des Index gibt mir der Compiler jedoch eine Fehlermeldung in der im Code markierten Zeile. Woran kann es liegen?

    import java.applet.Applet;
    import java.awt.*;
    import java.awt.event.*;
    
    public class Zeichenprogramm extends Applet implements ItemListener, MouseListener{
    
    	static Canvas c;
    	Choice colorChoice;
    
    	public void init(){
    		setLayout(new BorderLayout());
    
    		// Erstellen der Komponente für die Farbwahl
    		colorChoice = new Choice();
    		colorChoice.addItem("rot");
    		colorChoice.addItem("grün");
    		colorChoice.addItem("blau");
    		colorChoice.addItem("gelb");
    		add("East", colorChoice);
    
    		colorChoice.addItemListener(new Zeichenprogramm());
    
    		add("West", new Button("links"));
    		c = new MyCanvas();
    		add("Center", c);
    	}
    
    	class MyCanvas extends Canvas{
    		MyCanvas(){
    			setBackground(Color.blue);
    			addMouseListener(new Zeichenprogramm());
    		}
    	}
    
    	// Funktionen für den ActionListener
    	public void itemStateChanged(ItemEvent e){
    		int index;
    		index = colorChoice.getSelectedIndex();  [b]// Fehlermeldung erfolgt HIER[/b]
    
    		switch (index){
    			case 0:{ c.Brush.Color = red; break;}
    			case 1:{ c.Brush.Color = green; break;}
    			case 2:{ c.Brush.Color = blue; break;}
    			case 3:{ c.Brush.Color = yellow; break;}
    		}
    	}
    
    	public void mouseClicked(MouseEvent e){
    		c.setBackground(Color.red);
    	}
    
    	public void mouseEntered(MouseEvent e){
    	}
    
    	public void mouseExited(MouseEvent e){
    	}
    
    	public void mousePressed(MouseEvent e){
    	}
    
    	public void mouseReleased(MouseEvent e){
    	}
    
    }
    

    Grüße
    Neron17



  • Neron17 schrieb:

    Woran kann es liegen?

    Das geht möglicherweise aus dem Wortlaut der Fehlermeldung hervor. Aber da hier niemand hellsehen kann...



  • Naja, die Fehlermeldung des Compilers lautet einfach "Cannot find Symbol" - was jedoch bei jeder Fehlermeldung verwendet wird 😕

    Aber ich hab den Fehler inzwischen gefunden. Ich musste die Zeile "import java.awt.Choice" hinzufügen.

    Trotzdem danke 🙂



  • Hat zwar nicht unbedingt etwas mit deiner Fehlermeldung zu tun, aber bist du dir sicher, dass das Folgende Sinn macht/so beabsichtigt ist?

    colorChoice.addItemListener(new Zeichenprogramm());
    


  • Nein, sicher bin ich mir nicht. Ich hab immer noch kleine Probleme, die ich grad versuche zu lösen. Bitte sag mir, was ist verkehrt daran. Ich bin noch nicht sehr erfahren in Java und für jede Hilfe dankbar 🙂



  • du erstellst ein object und machst nichts damit
    Übergib doch das aktuelle Zeichenprogramm

    colorChoice.addItemListener(this);
    


  • Hallo

    Vielen Dank erstmal für den Hinweis. Mein Code sieht jetzt so aus

    import java.applet.Applet;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.Choice;
    import java.awt.Canvas;
    
    public class Zeichenprogramm extends Applet implements ItemListener, MouseListener{
    
    	static Canvas c;
    	Choice colorChoice;
    
    	public void init(){
    		setLayout(new BorderLayout());
    
    		// Erstellen der Komponente für die Farbwahl
    		colorChoice = new Choice();
    		colorChoice.addItem("rot");
    		colorChoice.addItem("grün");
    		colorChoice.addItem("blau");
    		colorChoice.addItem("gelb");
    		add("East", colorChoice);
    		colorChoice.addItemListener(this);
    
    		c = new MyCanvas();
    		c.addMouseListener(this);
    		add("Center", c);
    	}
    
    	class MyCanvas extends Canvas{
    		public MyCanvas(){
    			super();
    			setBackground(Color.blue);
    		}
    		int index;
    	}
    
    	// Funktionen für den ItemListener
    	public void itemStateChanged(ItemEvent e){
    	//	c.index = colorChoice.getSelectedIndex();
    	}
    
    	// Funktionen für den MouseListener
    	public void mouseClicked(MouseEvent e){
    		c.setBackground(Color.red);
    		c.index = 3;
    	}
    
    	public void mouseEntered(MouseEvent e){
    	}
    
    	public void mouseExited(MouseEvent e){
    	}
    
    	public void mousePressed(MouseEvent e){
    	}
    
    	public void mouseReleased(MouseEvent e){
    	}
    
    }
    

    Ich bekomme beim kompilieren jetzt die Fehlermeldung, dass die Variable index nicht gefunden werden kann in der Klasse Canvas. Ich habe in MyCanvas ja index deklariert, aber er erkennt die Variable wohl nicht. Was mache ich hier falsch?

    Grüße
    Neron17



  • Die Klasse Canvas enthaelt die Variable index nunmal nicht. Ob du diese Variable in irgendeiner Klasse deklarierst, die vielleicht von Canvas erbt, aendert an dieser Tatsache ueberhaupt nichts.
    ==> Wenn du auf die zusaetzlichen Variablen/Methoden von MyCanvas zugreifen willst, musst du als Typ auch MyCanvas angeben (fuer die Variable c in deinem Programm).



  • Moin moin

    Nobuo T schrieb:

    ==> Wenn du auf die zusaetzlichen Variablen/Methoden von MyCanvas zugreifen willst, musst du als Typ auch MyCanvas angeben (fuer die Variable c in deinem Programm).

    Asche auf mein Haupt, das hab ich total verpatzt 😕

    Inzwischen hab ich's berichtigt und bin nun auch gut vorangekommen. Inzwischen kann ich so zeichnen, wie ich mir das vorgestellt hatte, Pinselform und -farbe sind auch veränderbar. Allerdings habe ich noch 2-3 kleine Problemchen und würde euch bitten, mal reinzuschauen und mir zu sagen, was ich da verbessern könnte.

    import java.applet.Applet;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.Choice;
    import java.awt.Canvas;
    import java.awt.Point;
    
    public class Zeichenprogramm extends Applet implements ItemListener, MouseListener,
    	MouseMotionListener{
    
    	MyCanvas c;
    	Choice colorChoice;
    	Choice brushChoice;
    	boolean start = true;
    
    	// Punkte zur Speicherung der Mauspositionen
    	private Point p_new = new Point();
    	private Point p_old = new Point();
    
    	public void init(){
    		setLayout(new BorderLayout());
    
    		/* --- Farbwahl für die rechte Seite --- */
    
    		// Panel als Container
    		Panel p1 = new Panel();
    		p1.setLayout(new GridLayout(2,1));
    		// Label
    		Label l1 = new Label("Pinselfarbe", Label.CENTER);
    		p1.add(l1);
    		// Erstellen der Komponente für die Farbwahl
    		colorChoice = new Choice();
    		colorChoice.addItem("rot");
    		colorChoice.addItem("grün");
    		colorChoice.addItem("blau");
    		colorChoice.addItem("gelb");
    		colorChoice.addItem("schwarz");
    		colorChoice.addItemListener(this);
    		p1.add(colorChoice);
    		// Einfügen des Panels in das Applet
    		add("East", p1);
    
    		/* --- Pinselform für die rechte Seite --- */
    
    		// Panel als Container
    		Panel p2 = new Panel();
    		p2.setLayout(new GridLayout(2,1));
    		// Label
    		Label l2 = new Label("Pinselform", Label.CENTER);
    		p2.add(l2);
    
    		// Erstellen der Komponente für die Farbwahl
    		brushChoice = new Choice();
    		brushChoice.addItem("1");
    		brushChoice.addItem("2");
    		brushChoice.addItem("3");
    		brushChoice.addItem("4");
    		brushChoice.addItem("5");
    		brushChoice.addItemListener(this);
    		p2.add(brushChoice);
    
    		// Einfügen des Panels in das Applet
    		add("West", p2);
    
    		c = new MyCanvas();
    		c.addMouseListener(this);
    		c.addMouseMotionListener(this);
    		add("Center", c);
    	}
    
    	class MyCanvas extends Canvas{
    		public MyCanvas(){
    			setBackground(Color.white);
    		}
    		int color_index;
    		int brush_index;
    
    		public void paint(Graphics g)
    		{
    			Graphics2D g2 = (Graphics2D)g;
    			BasicStroke mypen = new BasicStroke( brush_index );
    			g2.setStroke(mypen);
    			switch (c.color_index){
    				case 0: g2.setColor(Color.red); break;
    				case 1: g2.setColor(Color.green); break;
    				case 2: g2.setColor(Color.blue); break;
    				case 3: g2.setColor(Color.yellow); break;
    				case 4: g2.setColor(Color.black); break;
    			}
    			g2.fillRect(p_new.x,p_new.y,0,0);
    			g2.drawLine(p_old.x, p_old.y, p_new.x, p_new.y);
    		}
    
    		public void update(Graphics g) {
    	        paint(g);
        	}
    	}
    
    	// Funktionen für den ItemListener
    	public void itemStateChanged(ItemEvent e){
    		c.color_index = colorChoice.getSelectedIndex();
    		c.brush_index = brushChoice.getSelectedIndex()+1;
    	}
    
    	// Funktionen für den MouseListener
    	public void mouseClicked(MouseEvent e){
    		p_new.x = e.getX();
    		p_new.y = e.getY();
    		p_old.x = p_new.x;
    		p_old.y = p_new.y;
    		c.repaint();
    	}
    
    	public void mouseEntered(MouseEvent e){
    	}
    
    	public void mouseExited(MouseEvent e){
    	}
    
    	public void mousePressed(MouseEvent e){
    	}
    
    	public void mouseReleased(MouseEvent e){
    		start = true;
    	}
    
    	public void mouseDragged(MouseEvent e)
    	{
    		p_old.x = p_new.x;
    		p_old.y = p_new.y;
    		p_new.x = e.getX();
    		p_new.y = e.getY();
    		if ( start )
    		{
    			p_old.x = p_new.x;
    			p_old.y = p_new.y;
    			start = false;
    		}
    		c.repaint();
    	}
    
    	public void mouseMoved(MouseEvent e){
    	}
    }
    

    1. Wenn man das applet laufen lässt, sieht man, dass die Labels links und rechts jeweils sehr viel Abstand zu den Choice Boxen haben. Wie könnte ich das ändern?

    2. Ich hätte gern einen Rahmen um das Canvas gezogen, damit das Zeichenfeld eindeutig begrenzt ist. Gibt es da eine Möglichkeit?

    3. Wenn ich das Fenster vergrößere bzw. verdecke (also im Prinzip wohl das komplette Applet neu zeichne), wird die Zeichnung wieder gelöscht. Wie kann ich das verhindern?

    Vielen Dank für Eure Hilfe 🙂
    Gruß
    Neron17


Anmelden zum Antworten