zeichenprogramm ohne saeuberungsfunktion

Status
Nicht offen für weitere Antworten.
C

chriz_h

Gast
Servus miteinander,
ich sitze seit geraumer Zeit vor meinem Java Buch und habe mich bisher auch strikt an dieses gehalten. Nur leider stosse ich immer wieder auf Probleme, sobald ich eigene Klassen und Methoden in vorgegebene Programme einbauen will. So auch mit folgendem Zeichenprogramm.Okay, die Idee u. der Ansatz sind aus nem Buch, aber ich war schon fleissig und habe eins zwei Klassen selbst implementiert. Wenn ich nun Zeile 125 bis 133 + 141 einbaue bekomm ich ne Fehlermeldung vom Compiler, die mir nicht schluessig ist. Naja, jedenfalls soll diese Klasse den Canvas Inhalt loeschen, so dass man neu zeichnen kann. Kann mir jemand sagen, warum das so nicht funktioniert?
mfG
ChRizZ

Code:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class malprogramm extends JFrame{
	meineCanvas m_malflaeche; //zum bemalen
	ButtonGroup m_formauswahl; //aktuelle Form
	int m_Xpos1, m_Ypos1; //aktuelle mausposition
	int m_Xpos2, m_Ypos2;
	
	public static void main(String[]args){
		malprogramm Fenster = new malprogramm("ChRizZ-PAINT");
		Fenster.pack();
		Fenster.setSize(400,350);
		Fenster.setResizable(true);
		Fenster.show();
	}
	
	
	//Konstruktor fuer Malflaeche und radiobuttons
	malprogramm(String titel){
		super(titel);
		
		//einen LayoutManager einrichten
		getContentPane().setLayout(new FlowLayout());
		
		m_malflaeche = new meineCanvas();
		getContentPane().add(m_malflaeche);
		
		
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(5,1,20,20));
		//Optionsfelder zur Formauswahl
		m_formauswahl = new ButtonGroup();
		
		//1. Optionsfelder erzeugen
		JRadioButton opt1 = new JRadioButton("Kreis",false);
		JRadioButton opt2 = new JRadioButton("Scheibe",false);
		JRadioButton opt3 = new JRadioButton("Rechteck",false);
		JRadioButton opt4 = new JRadioButton("Freihand",false);
		JButton opt5 = new JButton("clean");

		
		//2. Befehlsnamen fuer Optionfelder
		opt1.setActionCommand("Kreis");
		opt2.setActionCommand("Scheibe");
		opt3.setActionCommand("Rechteck");
		opt4.setActionCommand("Freihand");

		
		//3. Optionfelder in ButtonGroup aufnehmen
		m_formauswahl.add(opt1);
		m_formauswahl.add(opt2);
		m_formauswahl.add(opt3);
		m_formauswahl.add(opt4);
		//m_formauswahl.add(opt5);
		
		//Optionsfelder in Panel aufnehmen
		panel.add(opt1);
		panel.add(opt2);
		panel.add(opt3);
		panel.add(opt4);
		panel.add(opt5);
		
		getContentPane().add(panel);
		
		//Fensterschliesser als innere classe anlegen
		class meinWindowAdapter extends WindowAdapter{
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		}
		//schliesslich noch der WindowListener
		addWindowListener(new meinWindowAdapter());

	}
	
	class meineCanvas extends Canvas{
		
		class meinMouseAdapter extends MouseAdapter{
			public void mousePressed(MouseEvent e){
				//die aktuelle Pos. der Mouse merken
				m_Xpos1=e.getX();
				m_Ypos1=e.getY();

			}
			public void mouseReleased(MouseEvent e){
				m_Xpos2=e.getX();
				m_Ypos2=e.getY();
				repaint();
			}
			
		}
		public void update(Graphics g){
			paint(g);
		}
		
		class meinMouseMotionAdapter extends MouseMotionAdapter{
			public void mouseDragged(MouseEvent e){
				ButtonModel aktuell;
				String label;
				//herausfinden welche box gerade aktiviert ist
				aktuell = m_formauswahl.getSelection();
				if (aktuell == null)
					return;
				
				label = aktuell.getActionCommand();
				//wenn freihand gewaehlt, mousepos. merken
				if(label.equals("Freihand")){
					Graphics tmp = m_malflaeche.getGraphics();
					m_Xpos1=e.getX();
					m_Ypos1=e.getY();
					tmp.drawOval(m_Xpos1,m_Ypos1,2,2);
				}
			}
		}
		class meinActionLauscher implements ActionListener{
			public void actionPerformed(ActionEvent e){
				String label;
				label = e.getActionCommand();
				
				if(label.equals("clean"))
					m_malflaeche.repaint();
			}
		}
		
		
				
		//meineCanvas Konstruktor setzt Farben & implementiert das Mousehandling
		meineCanvas(){
			addMouseListener(new meinMouseAdapter());
			addMouseMotionListener(new meinMouseMotionAdapter());
			addActionListener(new meinActionLauscher());
			setBackground(Color.black);
			setForeground(Color.yellow);
		}
		
		//in dieser Methode wird gezeichnet
		public void paint(Graphics g){
			String label;
			ButtonModel aktuell = null;
			
			//Stellt die angeklickte Form fest
			aktuell = m_formauswahl.getSelection();
			
			//entsprechend handeln
			if(aktuell == null)
				return;
			
			//int w = (int) (Math.random()*300);
			//int h = (int) (Math.random()*300);
			label = aktuell.getActionCommand();
			
			if(label.equals("Kreis")){
				Graphics tmp = m_malflaeche.getGraphics();
				g.drawOval(m_Xpos1,m_Ypos1,(m_Xpos2-m_Xpos1)*2,(m_Xpos2-m_Xpos1)*2);
			}
			
			if(label.equals("Scheibe"))
				g.fillOval(m_Xpos1,m_Ypos1,(m_Xpos2-m_Xpos1)*2,(m_Ypos2-m_Ypos1)*2);
			
			if(label.equals("Rechteck"))
				g.drawRect(m_Xpos1,m_Ypos1,(m_Xpos2-m_Xpos1)*2,(m_Ypos2-m_Ypos1)*2);
		}
		
		
		
		//Diese Methode liefert die minimale Groesse der Canvas
		
		public Dimension getMinimumSize(){
			return new Dimension(300,300);
		}
		
		//Lieblingsgroesse auf Minimalgroesse setzen
		
		public Dimension getPreferredSize(){
			return getMinimumSize();
		}
	}
}
 

Karl

Aktives Mitglied
Hallo,

1) Der ActionListener muss an dem Button angemeldet werden, nicht an dem Canvas. Du hast den Clean-Button opt5 genannt, was aber nicht sinnvoll ist, da er ja nicht zu den Radiobuttons in der Gruppe gehört, sondern eine Schaltfläche darstellt. Vorläufig nenne ihn btnClean und deklariere ihn oben in der Klasse (da wo Du auch die ButtonGroup deklariert hast).
Dann änderst Du die Anmeldung des ActionListeners:

Code:
     // addActionListener(new meinActionLauscher());   // geht nicht!
     btnClean.addActionListener(new meinActionLauscher()); //am Button angemeldet

2) Du wirst als nächstes feststellen, dass nun zwar Dein Listener angesprochen wird, sich aber nichts tut.
Zum einen löscht Du nicht! Zum Löschen der Zeichenfläche ist innerhalb Deiner paint-Implementierung der Aufruf super.paint(g); am Einfachsten. Damit wird der Hintergrund gemalt. Das reicht aber nicht, weil Du beim Durchlauf Deiner paint-Methode das letzte Malereignis wiederholst. Du musst Dir also was überlegen, wie die Du den clean-Aufruf dort unterscheidest von den Malaufrufen. Du kannst ja vorerst ein flag setzen oder die Koordinaten ausnullen und Dir später eine vernünftige Lösung überlegen - soll ja erstmal laufen :D

3) Generelle Anmerkungen:
- Klassennamen beginnen mit einem Großbuchstaben und verwenden CamelCase (MeinSuperMalprogramm) - Variablennamen sollten keine Unterstriche enthalten (nur bei Konstanten), das "m_" (VisualBasic, oder?) hat hier keinen Sinn.
- Die Sichtbarkeit von Klassen und Konstruktoren (z.B. Malprogramm(String titel)) sollte (hier public) angegeben werden. Das Weglassen ist nämlich nicht etwa ohne Bedeutung, sondern hat eine festgelegte Semantik (package-protected). Nur Klassen desselben Package sehen diese so deklarierten Klassen bzw. solche Konstruktoren. Als Beginner stellt man sich leicht ein Bein, weil man schwer versteht, warum man z.B. bei Vererbung in anderen Packages die eigenen Klassen bzw. deren Konstruktoren um's Verrecken nicht sieht.
- Sowas sollte man nicht mit awt-Canvas machen, nimm ein JPanel oder einfach JComponent als Malfläche.
Swing und AWT sollten nach Möglichkeit nicht vermischt eingesetzt werden.

Möglicherweise ist Dein Buch zu alt und nicht besonders?

Gruß,
Karl
 
C

chriz_h

Gast
Danke erstmal fuer die ausfuehrlichen Tipps. Werd ich gleich mal ausprobieren, wenn ich @home bin. Das Buch ist in der Tat schon etwas aelter. (von Data Becker) Aber ich hab mich jetzt sowieso entschlossen, erstmal nen paar Tutorials von dieser Seite zu studieren und das Buch beiseite zu legen.
Ist wohl nicht ueberall Java rin wo Java draufsteht...
mfG
ChRizZ
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Zeichenprogramm mit ColorPoint Java Basics - Anfänger-Themen 2
A Zeichenprogramm Java Basics - Anfänger-Themen 8
P Zeichenprogramm-->update() aushebeln Java Basics - Anfänger-Themen 11
b3ny zeichenprogramm mit awt und swing.... Java Basics - Anfänger-Themen 6
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
V JSON-Objs aus JSON-Obj filtern und löschen (Manipulation ohne Kenntnis der vollst. Struktur) Java Basics - Anfänger-Themen 12
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
T Mehrere if bedingungen ohne & Java Basics - Anfänger-Themen 2
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
Mugetsu35 ArrayList Update ohne Index Java Basics - Anfänger-Themen 6
P 2n Potenzieren ohne Math.pow oder pow Java Basics - Anfänger-Themen 8
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
Zentriks Hilfe zu Sieb des Eratosthenes ohne boolean Java Basics - Anfänger-Themen 5
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
X Enum Abfrage ohne if, for, while oder switch Java Basics - Anfänger-Themen 21
R Buttons ohne Funktion Java Basics - Anfänger-Themen 2
JavaBeginner22 TextArea, ohne Zeilenumbruch? Java Basics - Anfänger-Themen 4
frager2345 Programm erstellen ohne Autoboxing und Unboxing Java Basics - Anfänger-Themen 13
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
S Was macht ++ ohne Schleife? Java Basics - Anfänger-Themen 4
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
B Jar Dateien ohne IDE verwenden? Java Basics - Anfänger-Themen 1
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
M Konstruktor ohne Übergabe eines Wertes Java Basics - Anfänger-Themen 7
S Chars vergleichen ohne Betrachtung der Groß und Kleinschreibung Java Basics - Anfänger-Themen 7
javapingu Variablenwerte ändern ohne return Statement? Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
E Meine JCombobox werte an ohne selectiert zu haben Java Basics - Anfänger-Themen 6
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
M for schleife ohne geschweifte Klammer Java Basics - Anfänger-Themen 15
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
L Zufälligen Zahlencode, ohne mehrfacher Verwendung einer Ziffer Java Basics - Anfänger-Themen 15
Sinan Arrays auflisten ohne Wiederholung Java Basics - Anfänger-Themen 28
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
T Variable in for Schleife ansprechen ohne Array ? Java Basics - Anfänger-Themen 25
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
S Teilen ohne Rest Java Basics - Anfänger-Themen 15
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
C Array-Werte werden gemischt, ohne Logik Java Basics - Anfänger-Themen 2
C Programm ausführen ohne JRE? Java Basics - Anfänger-Themen 3
C NumberFormatException: null ohne Ausnahmebehandlung stoppen Java Basics - Anfänger-Themen 7
P Methode trim() ohne StringBuilder Java Basics - Anfänger-Themen 1
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4
C Projekte in 2 versch. Arbeitsbereichen: auf ein Projekt verweisen (ohne Fehler zu bekommen) Java Basics - Anfänger-Themen 8
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
Z Methode zum Heraufinden von Anagrammen ohne Java API, Ausnahme String Java Basics - Anfänger-Themen 14
Z Attribut ändern ohne Kontrollstruktur Java Basics - Anfänger-Themen 2
R Boolean value ohne Kontrollstrukturen ändern Java Basics - Anfänger-Themen 5
C Wie habt Ihr angefangen mit der Java Programmierung, ohne Programmiervorkenntnisse Java Basics - Anfänger-Themen 8
S Klassenmethode ohne static Java Basics - Anfänger-Themen 2
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
M Bubblesort ohne Array Java Basics - Anfänger-Themen 30
J Array vertauschen ohne ein neues anzulegen?! Java Basics - Anfänger-Themen 10
F Hilfe - Wahrheitswert überprüfen ohne If Java Basics - Anfänger-Themen 2
ZH1896ZH Java-SemesterTest ohne Lösung :( Java Basics - Anfänger-Themen 47
V Erste Schritte Berechnen von Sinus; sin(x) ohne Math.* Java Basics - Anfänger-Themen 1
C Teilbarkeit ohne "if" Java Basics - Anfänger-Themen 3
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
B Input/Output System.out.print mit und ohne "" Java Basics - Anfänger-Themen 5
J Mein Programm beendet sich ohne mein Zutun Java Basics - Anfänger-Themen 9
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
F Buchstaben in einem String vertauschen (Ohne replace) Java Basics - Anfänger-Themen 10
R for schleife ohne klammer Java Basics - Anfänger-Themen 14
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
C Problem: PC ohne Internet und keine Möglichkeit Programme zu laden Java Basics - Anfänger-Themen 5
C unverständlicher Code Attribute ohne Datentyp, wie geht das? Java Basics - Anfänger-Themen 8
C Konstruktor mit und ohne Parameterliste Java Basics - Anfänger-Themen 13
B Potenzrechnung mit WindowBuilder ohne math.pow() Java Basics - Anfänger-Themen 1
Jackii ArrayList ausgabe ohne Dopplung Java Basics - Anfänger-Themen 11
E Pfade eines Baums angeben ohne Rekursion Java Basics - Anfänger-Themen 20
J Division ohne Arithmetische Funktion Java Basics - Anfänger-Themen 2
D .txt überschreiben mit BufferedWriter ohne reset Java Basics - Anfänger-Themen 6
H Cäsar chiffrierung ohne if-Anweisung Java Basics - Anfänger-Themen 5
A Input/Output System.out Ausgabe aktualisieren, ohne Konsole vollzuspamen Java Basics - Anfänger-Themen 2
B Potenzen ohne Math.pow Java Basics - Anfänger-Themen 4
A Methoden Unterscheid zwischen public und ohne Java Basics - Anfänger-Themen 9
M Liste ohne Duplikate Java Basics - Anfänger-Themen 8
S Rekursiver InsertionSort ohne Schleife Java Basics - Anfänger-Themen 7
4 Median ohne Array Rausbekommen Java Basics - Anfänger-Themen 8
L Auf Methoden einer Subklasse zugreifen ohne Typecast ? Java Basics - Anfänger-Themen 6
5 for-Schleife ohne 3 Angaben Java Basics - Anfänger-Themen 2
D Sortiertes Array mischen ohne Duplikat Java Basics - Anfänger-Themen 5
M Email versenden Outlook, attached File, ohne Anmeldung Java Basics - Anfänger-Themen 4
P JavaFX ohne FXMLLoader Java Basics - Anfänger-Themen 3
J Erstellen einer Datei ohne path Java Basics - Anfänger-Themen 1
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
P Kann ich Java - Programme auch ohne Editor öffnen? Java Basics - Anfänger-Themen 70
E Methoden Objekte in Methode aufrufen ohne getter und setter? Java Basics - Anfänger-Themen 1
E Wie Passwort-Eingabe (ohne Echo!) über Konsole ? Java Basics - Anfänger-Themen 4
C Klassen JTable wird ohne Header aufgebaut Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben