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 ZeichenprogrammcolorChoice.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