Zeichenprogramm mit Factory-Pattern

Status
Nicht offen für weitere Antworten.

Sindbad1983

Top Contributor
durch Hast und Unachtsamkeit.
..geil

:shock:

danke, wieder was Neues gelernt! :idea:



vielleicht so:

Code:
r.setBounds(pressedX,pressedY,releasedX-pressedX,releasedY-pressedY);

das hingegen ist mir noch nicht ganz klar

Denk auch dran das jede JComponent ihr eigenes Koordinatensystem hat,

genügt da nicht

Code:
setBounds(0,0,600,600);


??
 

Wildcard

Top Contributor
Derzeit zeichnest du so:

Code:
      g.fillRect(pressedX,pressedY,releasedX-pressedX,releasedY-pressedY);
Da dein Rectangle aber eine eine JComponent ist hat sie ein eigenes Koordinatensystem das eben auch wieder bei 0,0 anfängt.
pressed/released bezieht sich aber auf das Koordinaten-System des Panels, da dort der MouseClick registriert wurde.
Dieser Code zeichnet also auserhalb der Komponete bzw gar nicht :wink:

EDIT:
Code:
r.setBounds(pressedX,pressedY,releasedX-pressedX,releasedY-pressedY);
nimm Math.abs, sonst kriegst du Probleme wenn der user das Rechteck nach oben aufzieht
 

Sindbad1983

Top Contributor
mensch, ich bin jetzt tief verzweifelt...

mir kommt jetzt alles durcheinander...swing, awt...was weiß ich..

ich hab jetzt noch was anderes probiert... ohne JComponent..aber das funktioniert auch nicht!

Jetzt brech ich gleich!

Wird wieder mal Zeit für ein Erfolgserlebnis!
Hab schon 2 Tage lang keine mehr gehabt! :cry: :cry: :cry:


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


public class Rectangle{
	
	
	

	int pressedX;
	int pressedY;
	int releasedX;
	int releasedY;
	
	public void getpressedXY(int x, int y){
		pressedX=x;
		pressedY=y;
	}
	
	public void getreleasedXY(int x, int y){
		releasedX=x;
		releasedY=y;
	}
	


	public void paintComponent(final java.awt.Graphics g1 )   { 
		final java.awt.Graphics2D g =( java.awt.Graphics2D )g1; 
		g.setColor(Color.black);
		g.fillRect(pressedX,pressedY,releasedX-pressedX,releasedY-pressedY);

	}


}

Code:
public class PaintFrame extends JFrame implements ActionListener{
	
	
	
	
	public PaintFrame(String titel){
		super(titel);
		
		Container c=getContentPane();
		Zeichenflaeche zeichenflaeche=new Zeichenflaeche();
		c.add(zeichenflaeche);
		System.out.println("bbbb");
	}
	
	
	public void makeMenu(){
		
	MenuBar bar=new MenuBar();
		
		
		 Menu m = new Menu("Look & Feel");
		 m.add(new MenuItem("Rot"));
		 m.add(new MenuItem("Blau"));
		 m.add(new MenuItem("Grün"));
		 bar.add(m);
		 setMenuBar(bar);
		 System.out.println("ccc");
		 
		
	
	}
	
	public void actionPerformed(ActionEvent e) {
		
		
	}
	
	public static void main(String [] args){
		PaintFrame frame=new PaintFrame("Zeichenprogramm");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		
		frame.setSize(600,600);
		frame.setLocation(300,300);
		frame.setVisible(true);
		frame.makeMenu();
			
	}

}

Code:
public class Zeichenflaeche extends JPanel implements MouseListener, MouseMotionListener{
	
	
	
	Rectangle r;
	
	
	int pressedX;
	int pressedY;
	int releasedX;
	int releasedY;
	
	public Zeichenflaeche(){
		
		System.out.println("eee");
		
		setBackground(Color.RED);
		setPreferredSize( new java.awt.Dimension(600,600)); 
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
		System.out.println("ddd");
	}
	
	public void mouseClicked(MouseEvent e) {
	}

	public void mousePressed(MouseEvent e) {
		
		r=new Rectangle();
		
		System.out.println("aaaaa");
		  pressedX=getX();
		  pressedY=getY();
	
		r.getpressedXY(pressedX,pressedY);
		System.out.println("zzzz");
	
		
		
	}

	public void mouseReleased(MouseEvent e) {
		
		System.out.println("yyyyy");
		   releasedX=getX();
		   releasedY=getY();
		r.getreleasedXY(releasedX,releasedY);
		
		repaint();
		
		System.out.println("ffff");

	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mouseDragged(MouseEvent e) {
	}

	public void mouseMoved(MouseEvent e) {
	}

	
	
}
 

Sindbad1983

Top Contributor
du lässt mich ordentlich zappeln..


aber wahrscheinlich willst du nur, dass ich selber draufkomm!?

ich bin dir trotzdem unglaublich dankbar!

Hättest sicher bessere Dinge zu tun, als einem Java-Anfänger (den ganzen Tag) zu helfen..
 

Wildcard

Top Contributor
Das ist mal der Anfang. Die Factory musst du da jetzt selbst reinbauen :wink:
Code:
/**
 * 
 */
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * @author Wildcard
 * created at 08.06.2005
 */
public class DrawingFrame extends JFrame
{

	private DrawingPanel panel;
	
	public DrawingFrame()
	{
		panel = new DrawingPanel();
		getContentPane().add(panel);
		panel.setSize(getContentPane().getSize());
		panel.setFocusable(true);
		panel.requestFocus();
		
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		DrawingFrame frame = new DrawingFrame();
		frame.setSize(500,500);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);

	}

}

class DrawingPanel extends JPanel implements MouseListener
{
	private ArrayList children = new ArrayList();
	
	private Point clickPoint;
	
	public DrawingPanel()
	{
		addMouseListener(this);
	}
	
	protected void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		drawChildren(g);
	}

	private void addFigure(Figure f)
	{
		children.add(f);
	}
	
	/**
	 * @param g
	 */
	private void drawChildren(Graphics g)
	{
		Iterator it = children.iterator();
		while (it.hasNext())
		{
			Figure child = (Figure) it.next();
			child.draw(g);
			
		}
		
	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
	 */
	public void mouseClicked(MouseEvent e)
	{
		// TODO Auto-generated method stub
		
	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
	 */
	public void mousePressed(MouseEvent e)
	{
		clickPoint = e.getPoint();
		
	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
	 */
	public void mouseReleased(MouseEvent e)
	{
		MyRectangle rect = new MyRectangle();
		Rectangle bounds = new Rectangle(clickPoint);
		bounds.add(e.getPoint());
		rect.setBounds(bounds);
		addFigure(rect);
		repaint();
		
	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
	 */
	public void mouseEntered(MouseEvent e)
	{
		// TODO Auto-generated method stub
		
	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
	 */
	public void mouseExited(MouseEvent e)
	{
		// TODO Auto-generated method stub
		
	}
	
}


abstract class Figure
{
	protected Rectangle bounds;
	
	protected Point location;
	
	abstract public void draw(Graphics g);

	public Rectangle getBounds()
	{
		return bounds;
	}

	public void setBounds(Rectangle bounds)
	{
		this.bounds = bounds;
	}

	public Point getLocation()
	{
		return location;
	}

	public void setLocation(Point location)
	{
		this.location = location;
	}	
}

class MyRectangle extends Figure
{

	/* (non-Javadoc)
	 * @see Anfaenger.Sindbad.Figure#draw(java.awt.Graphics)
	 */
	@Override
	public void draw(Graphics g)
	{
		g.drawRect(bounds.x,bounds.y,bounds.width,bounds.height);
		
	}
	
}

EDIT: da ich nicht weiß welche Java Version du benutzt hab ich's mal Java 1.4 konform gemacht.
 

Sindbad1983

Top Contributor
boa...cool

danke..das wär aber nicht notwenig gewesen!!

Aber weißt du, wo bei mir der Fehler liegt?
Das wär auch so interessant für mich!
Da kann ja nicht mehr viel fehlen!! oder schon?

:roll:
 

Sindbad1983

Top Contributor
wahnsinn..das hast du echt klasse gemacht...
ich versteh alles..ist irgendwie ganz einfach..und trotzdem hab ich da solche Probleme..
das wird noch ein steiniger Weg... :-(

wie lang hast du da jetzt gebraucht für?
 

Wildcard

Top Contributor
Sindbad1983 hat gesagt.:
Aber weißt du, wo bei mir der Fehler liegt?
Das wär auch so interessant für mich!
Da kann ja nicht mehr viel fehlen!! oder schon?
Ist das oben dein aktueller Code?
Du setzt die Rectangles nicht richtig auf das Panel wie schon gesagt.
Nimm lieber die Vorlage von mir, dein Code ist durch 'trial-and-error" schon etwas unsauber geworden :wink:

Sindbad1983 hat gesagt.:
wahnsinn..das hast du echt klasse gemacht...
ich versteh alles..ist irgendwie ganz einfach..und trotzdem hab ich da solche Probleme..
das wird noch ein steiniger Weg... :-(

wie lang hast du da jetzt gebraucht für?
je größer die herausforderung, desto mehr lernt man dabei :wink:
so ungefähr 15 mins...
 

Sindbad1983

Top Contributor
dort wo ich geschrieben hab.."mensch jetzt bin ich verzweifelt"

ist mein aktueller Code

15min..wahnsinn

ich sitz schon seit 7 Stunden da und nichts geht!

Hab deins grad ausprobiert..funktioniert perfekt!

Danke!


PS:Findest du dieses Beispiel mit den Factories schwer?
ist das ein Anfängerbeispiel`?
 

Wildcard

Top Contributor
Schwierig zu definieren was ein Anfängerbeispiel ist. Selbst zeichnen ist nie so richtig 'Anfänger'
Ausserdem programmierst du ja fast genausolange mit Java wie ich :wink:
Factories sind nicht wirklich kompliziert, es wird ja lediglich die Objekterzeugung ausgelagert.
Finde es aber sehr gut das ihr sinnvolle Sachen programmiert und euch auch mit Design-Patterns beschäfftigt.
Das ist nämlich viel wichtiger als Java zu können...
 

Sindbad1983

Top Contributor
wieso?
wielange programmierst du leicht schon?
studierst du auch?

naja..ich hab vor 2 Jahren angefangen, aber so richtig erst seit 3,4 Monaten...dazwischen immer laaaange Pausen gemacht!

Ich hab in der Schule NIE progammiert und daraus resultierend tu ich mir verhältnismäßig schwer bzw. hab immer wieder mit Verständnisproblemen bei scheinbar einfachen Dingen zu kämpfen..wie man ja unschwer erkennen kann!

Aber es wird schon besser!
Ich hab Ende Juni Klausur und bis dahin muss ich all das auf die Reihe kriegen..

..aber was würd ich ohne euch machen...
 

Wildcard

Top Contributor
[offtopic]
Bin BA-Student, und hab mit Java im September angfangen.
Ich denke die Übungsaufgabe ist genau das richtige um etwas über gute Klassenstruktur und Swing zu lernen.
Kompliment an euren Prof!
Gerade im hinblick auf die Klausur: sieh dir meinen Code nochmal an und wenn du genau verstehst was ich gemacht
habe, und warum ich es so gelöst habe (kannst mich natürlich auch über PN fragen) fängst du an die Factory einzubauen
und das Prog Stück für Stück zu erweitern.

Viel Erfolg :wink:
[/offtopic]
 

Sindbad1983

Top Contributor
was ist jetzt eigentlich der Unterschied zu:

Code:
public class PaintFrame extends JFrame implements ActionListener{
	
	private Zeichenflaeche zeichenflaeche;
	
	
	public PaintFrame(String titel){
		super(titel);
		
		Container c=getContentPane();
		zeichenflaeche=new Zeichenflaeche();
		c.add(zeichenflaeche);
		zeichenflaeche.setFocusable(true); 
	    zeichenflaeche.requestFocus();
		System.out.println("bbbb");
	}


und


Code:
	public PaintFrame(String titel){
		super(titel);
		
		Container c=getContentPane();
		Zeichenflaeche zeichenflaeche=new Zeichenflaeche();
		c.add(zeichenflaeche);
		zeichenflaeche.setFocusable(true); 
	    zeichenflaeche.requestFocus();
		System.out.println("bbbb");
	}

bliebt sich ja eigentlich komplett wurscht, wo Zeichenflaeche deklariert wird, oder?

oder hat das schon eine Bedeutung...?
 

Wildcard

Top Contributor
Die erste Variante wählt man wenn man in der ganzen Klasse zugriff auf die Zeichenfläche braucht, die zweite wenn das nicht nötig ist.
 

Sindbad1983

Top Contributor
boa..ich habs endlich geschafft, dass es mit meiner Version auch geht!

es funktioniert großartig! juhuuuuuuuuuuuuuuuuuuuuuuuuu!
Danke Wildcard! :applaus:


die nächsten Tage werd ich dann Schritt für Schritt versuchen, das Ding zu erweitern!

Zuerst mal werd ich Kreise und Ellipsen hinzufügen...
und dann probier ich erst mal die factory...ich muss damit beginnen, dass ich alles verstehe, was ich das so programmier! :###

Danke nochmal für deine tolle Hilfsbereitschaft!
Schlaf gut,ciao
 

Sindbad1983

Top Contributor
Hi!

Also was ich noch nicht ganz versteh?

Warum hast du in der Klasse Zeichnflaeche eine paintComponent Methode gemacht?

Wird die da überschrieben?

..wahrscheinlich weilst ja einen super-Aufruf machst!

Aber die Klasse erbt ja nur von JPanel ...

Code:
	protected void paintComponent(Graphics g){
		
		super.paintComponent(g);
		drawChildren(g);
	}
 

Wildcard

Top Contributor
paintComponent ist die Methode die man bei allen lightweight-Swing-Komponenten (alles von von JComponent abgeleitet ist, also auch JPanel) überschreibt um zeichnen zu können.
Ich hab die Methode überschrieben damit die Figures auf das Graphics-Objekt des Panels zeichnen können.
 

Sindbad1983

Top Contributor
ok..is klar


und ich hab gleich noch ne Frage...


Code:
public void mouseReleased(MouseEvent e) 
   { 
      MyRectangle rect = new MyRectangle(); 
      Rectangle bounds = new Rectangle(clickPoint); 
      bounds.add(e.getPoint()); 
      rect.setBounds(bounds); 
      addFigure(rect); 
      repaint(); 
       
   }


wenn ich jetzt das ganze mit ner Oberklasse Figure mach, und dabei Rectangle und Circle davon ableite, müsste ich eigentlich nur überall statt Rectanle Figure schreiben...

nur bei mouseReleased hab ich ein Problem, weil

Code:
Figure f=new Figure()
funktioniert ja nicht, da die Klasse abstrakt ist... :bahnhof:
 

Sindbad1983

Top Contributor
ok..hat sich schon erledigt..bin selber draufgekommen!

Hab einfach den KeyListener implementiert und es haut super hin!
Vielleicht ein bissl umständlich, aber es funktioniert!

Hättest du es anders? besser? eleganter gemacht?

Code:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.*;


public class Zeichenflaeche extends JPanel implements MouseListener, KeyListener{
	
	
	
	private ArrayList list;
	Figure f;
	int ergebnis;
	
	Point startpoint;
	
	
	int pressedX;
	int pressedY;
	int releasedX;
	int releasedY;
	
	public Zeichenflaeche(){
		
		list=new ArrayList();
		
		
		setPreferredSize( new java.awt.Dimension(600,600)); 
		this.addMouseListener(this);
		this.addKeyListener(this);
	
		
	}
	
	protected void paintComponent(Graphics g){
		
		super.paintComponent(g);
		drawChildren(g);
	}
	
	
	public void drawChildren(Graphics g){
		
		Iterator it=list.iterator();
		
		while(it.hasNext()){
			Figure child=(Figure)it.next();
			child.draw(g);
			
		}
	}
	

	public void addFigure(Figure f){
		list.add(f);
	}
	
	public void mouseClicked(MouseEvent e) {
	}

	public void mousePressed(MouseEvent e) {
		
	
		startpoint=e.getPoint();
		
		System.out.println("zzzz");
	
	}
	
	

	public void mouseReleased(MouseEvent e) {
		
		
		switch(ergebnis){
		case 1:
			 Figure f=new Circle();
			  
			   Point zielpoint=e.getPoint();
			   f.setXY(startpoint.x, startpoint.y,zielpoint.x,zielpoint.y);
			   addFigure(f);
			   repaint();
			   break;
			  
			
			
			
		
		case 2: 
			 Figure fg=new Rectangle();
			  
			    Point zielpoint2=e.getPoint();
			   fg.setXY(startpoint.x, startpoint.y,zielpoint2.x,zielpoint2.y);
			   addFigure(fg);
			   repaint();
			   break;
			   
			
			
			
			
		}
	}
		
	
	
		

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void keyTyped(KeyEvent e) {
		
		
		
		char key=e.getKeyChar();
		
		if(key==KeyEvent.VK_ENTER){
			makeCircle();
			System.out.println("Enter");
		}
		else if(key==KeyEvent.VK_SPACE){
			makeRectangle();
			System.out.println("Leertaste");
		}
		
		
		
	}

	public void keyPressed(KeyEvent e) {	
	}

	public void keyReleased(KeyEvent e) {		
	}
	
	public int makeCircle(){
		System.out.println("makeCircle wurde aufgerufen");
		ergebnis=1;
		
		return ergebnis;
		
	}
	
	public int  makeRectangle(){
		System.out.println("makeRectangle wurde aufgerufen");
		ergebnis=2;
		return ergebnis;
	}

	
	
}
 

Wildcard

Top Contributor
Je mehr du daran jetzt weiterschreibst, desto schwieriger wirds nachher die Factory einzubauen.
Nur so'n Tipp... :wink:
 

Sindbad1983

Top Contributor
hast sicher Recht..

aber ich werd dann eh wieder vom Ausgangspunkt los starten..
was ich aber noch unbedingt jetzt weiter programmieren möcht ist, dass die Kreise in verschiedenen Farben dargestellt werden!

Die Farbe kann ich aber nicht in Figure speichern, weil Figure ja abstrakt ist.. jetzt fällt mir grad ein, muss die eigentlich abstarkt sein? was ist, wenn ich sie nicht abstrakt mache? dann kann ich trotzdem die Unterklassen von dieser erben lassen, oder?

Nur beim Factory-Pattern muss die Oberklasse abstrakt sein glaub ich...

oder gibts ne andere Möglichkeit, wie ich die Farbe speichern bzw. übergeben kann?
Weil bestimmt wird die Farbe ja über die MenuItems..
 

Sindbad1983

Top Contributor
übrigens wartet schon die nächste Übung...3 Pattern müssma da verwenden -> das wird spaßig! :-(

..ich muss mich also beeilen!

Bis dann
ciao
 

Wildcard

Top Contributor
Natürlich kannst du die Farbe in Figure speichern (solltest du auch in jedem Fall tun).
Bis auf die Instanzierung können abstrakte Klassen alles was normale Klassen können.
OOP orientiert sich möglichst nahe am 'normalen Leben'.
Rechteck, Dreieck, Kreis sind Formen. Wenn ich dir sage "mal mir einen Kreis" kannst du das machen
Wenn ich dir allerdings sage mal "mir eine Form" bist du aufgeschmissen und malst entweder einen Kreis, ein Rechteck, oder ein Dreick.
Eine Form ist also etwas abstraktes.
Deshalb ist auch Figure abstarkt, da die Instanzierung einer Figure keinen Sinn machen würde.
 

Sindbad1983

Top Contributor
hi Wildcard!

Ja, das hab ich auch schon versucht, aber die Farbe kann ich in Figure nur durch

f.setColor(c) speichern oder?

Und dazu brauch ich aber f=new Figure, weil ich sonst ne NullP.E. bekomme!..

weißt du was ich mein?

PS: morgen häng ich mich wieder voll rein!
War die letzten 2 Tage auf Kurzurlaub in Innsbruck! :toll:
 

Wildcard

Top Contributor
nein, du brauchst eine Instanzvariable vom Typ Color (entweder einen getter einbauen oder protected machen).
Diese kannst du in Figure setzen und bei der konkreten Implementierung in der drawMethode mit g.setColor(super.color) verwenden.
 

Sindbad1983

Top Contributor
naja .. Color hab ich eh als Instanzvariable in Figure gespeichert!


und die setMethode hab ich auch:

Code:
public void setColor(Color c){
this.c=c;
}


aber PaintFrame hab ich ja den KeyListener eingebaut und da wird je nach Auswahl eines MenuItems eine andere Farbe gespeichert! Die Farbe wird dann in Color von Figur gespeichert, das ist mir völlig klar!

Aber trotzdem komm ich um das f.setColor(Color.blue) nicht herum -> weil nur setColor allein genügt nicht!
Also das f. brauch ich unbedingt! Oder hab ich da jetzt nen Denkfehler drinnen? ???:L
 

Wildcard

Top Contributor
dann versteh ich die Frage nicht!
was hat das ganze mit 'ner NullPointerException zu tun?
:bahnhof:
 

Sindbad1983

Top Contributor
naja..wie willst du etwas in ner Klasse setzen, wenn du nicht mal ein Objekt hast, in dem du etwas speichern kannst!?
Ich bin immer davon ausgegangen, dass man zuerst eine Instanz von einer Klasse bilden muss, bevor man die Variablen mit den Methoden verändern kann (bzw. Werte mit set-Methoden) speichern kann...

Verstehst?
Also wie soll ich dann an dem Figure f=new Figure() vorbeikommen?

wenn ich die Instanzvariable Color c mit
f.setColor(Color.blue) setzen soll...

alles klar?
das ist nämlich mein Problem!

Weil wenn ich in PaintFrame einfach nur sag:

setColor(Color.blue) dann weiß er ja nicht, dass das setColor zu Figure gehört..ok?

ich hoffe, du verstehst mich jetzt... :)
 

Wildcard

Top Contributor
Du kannst doch aber nicht einfach eine neue Figure erstellen wenn man die Farbe ändert :autsch:
Wenn der Benutzer die nächste Figure erstellt muss die Factory eben wissen welche Farbe gerade ausgewählt ist und die neue Figure dementsprechend modifizieren.
 

Sindbad1983

Top Contributor
Es funktioniert!!!

Tut mir leid Wildcard..da hatten wir wohl einen Kommunikationsfehler!
Ich war ja grad dabei die selbe Aufgabe zuerst mal ohne Pattern zu implementieren..
und es geht jetzt : habs mit einer eigenen Klasse und einer static Variable geschafft, die ich gesetzt hab!


Jetzt schau ich, dass ich das Pattern noch irgendwie hinbekomm...


Damit siehst, wie ichs gemacht hab:


Code:
public class PaintFrame extends JFrame implements ActionListener{
	
	
	private Zeichenflaeche zeichenflaeche;
	
	
	
	
	ActionListener listener;
	public PaintFrame(String titel){
		super(titel);
		
		
	
		
		zeichenflaeche=new Zeichenflaeche();
		getContentPane().add(zeichenflaeche); 
	    zeichenflaeche.setSize(getContentPane().getSize()); 
	    zeichenflaeche.setFocusable(true); 
	    zeichenflaeche.requestFocus(); 
	}
	
	
	public void makeMenu(){
		
	MenuBar bar=new MenuBar();
		
		
		 Menu m = new Menu("Look & Feel");
		 MenuItem red=new MenuItem("Red");
		 MenuItem blue=new MenuItem("Blue");
		 MenuItem green=new MenuItem("Green");
		
		 m.add(red);
		 red.addActionListener(this);
		 m.add(blue);
		 blue.addActionListener(this);
		 m.add(green);
		 green.addActionListener(this);
		 bar.add(m);
		 setMenuBar(bar);
		 System.out.println("ccc");
		 
		 
		
	
	}
	
	public void actionPerformed(ActionEvent e) {
		
		
		String me=e.getActionCommand();
	
		
		
		if(me.equals("Red")){
			System.out.println("Rot wurde ausgewählt");
			Farbe.c=Color.RED;
			
		
		}
		else if(me.equals("Blue")){
			System.out.println("Blau wurde ausgewählt");
			Farbe.c=Color.BLUE;
			
		}
		else if(me.equals("Green")){
			System.out.println("Grün wurde ausgewählt");
			Farbe.c=Color.GREEN;
			
			
			
			
		}
		
		
	}
	
	public static void main(String [] args){
		PaintFrame frame=new PaintFrame("Zeichenprogramm");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		
		frame.setSize(600,600);
		
		frame.setLocationRelativeTo(null); 
		frame.setVisible(true);
		frame.makeMenu();
		

		

			
	}

}


Code:
public class Zeichenflaeche extends JPanel implements MouseListener,KeyListener{
	
	
	
	private ArrayList list;
	Figure f;
	int ergebnis;
	Farbe farbe;
	
	Point startpoint;
	
	
	int pressedX;
	int pressedY;
	int releasedX;
	int releasedY;
	
	public Zeichenflaeche(){
		
		list=new ArrayList();
		
		
		setPreferredSize( new java.awt.Dimension(600,600)); 
		this.addMouseListener(this);
		this.addKeyListener(this);
	
		
	}
	
	protected void paintComponent(Graphics g){
		
		super.paintComponent(g);
		drawChildren(g);
	}
	
	
	public void drawChildren(Graphics g){
		
		Iterator it=list.iterator();
		
		while(it.hasNext()){
			Figure child=(Figure)it.next();
			child.draw(g);
			
		}
	}
	

	public void addFigure(Figure f){
		list.add(f);
	}
	
	public void mouseClicked(MouseEvent e) {
	}

	public void mousePressed(MouseEvent e) {
		
	
		startpoint=e.getPoint();
		
		System.out.println("zzzz");
	
	}
	
	
	

	public void mouseReleased(MouseEvent e) {
		
		
		System.out.println("Die Maus wurde gedrückt");
	
		
		switch(ergebnis){
		case 1:
			 Figure f=new Circle();
			 f.setColor(Farbe.c);
			 
			   Point zielpoint=e.getPoint();
			   f.setXY(startpoint.x, startpoint.y,zielpoint.x,zielpoint.y);
			   addFigure(f);
			   repaint();
			   break;
			  
			
			
			
		
		case 2: 
			 Figure fg=new Rectangle();
			 
			 fg.setColor(Farbe.c);
			
			  
			   Point zielpoint2=e.getPoint();
			   fg.setXY(startpoint.x, startpoint.y,zielpoint2.x,zielpoint2.y);
			   addFigure(fg);
			   repaint();
			   break;
		}
	}
	

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void keyTyped(KeyEvent e) {
		
		
		
		char key=e.getKeyChar();
		
		if(key==KeyEvent.VK_ENTER){
			makeCircle();
			System.out.println("Enter");
		}
		else if(key==KeyEvent.VK_SPACE){
			makeRectangle();
			System.out.println("Leertaste");
		}
		
		
		
	}

	public void keyPressed(KeyEvent e) {	
	}

	public void keyReleased(KeyEvent e) {		
	}
	
	public int makeCircle(){
		System.out.println("makeCircle wurde aufgerufen");
		ergebnis=1;
		
		return ergebnis;
		
	}
	
	public int  makeRectangle(){
		System.out.println("makeRectangle wurde aufgerufen");
		ergebnis=2;
		return ergebnis;
	}


	
	
}

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

public class Farbe {
	
    static	Color c;
	
}
 

Wildcard

Top Contributor
Also das war jetzt echt die schlechteste Möglichkeit :shock:
Lass den Mist mit der Farbe Klasse und mach dir stattdessen in Zeichenfläche eine private Variable Color in
der die Farbauswahl steht.
Ist zwar IMHO von der Logik her an der falschen Stelle, aber bevor du solche seltsamen Konstrukte verwendest... :wink:
 

Sindbad1983

Top Contributor
jaaaaaaaaaaa es funktioniert!!!


Wenn das jetzt auch die (halbigs) richtige Implementierung eines Factory-Patterns ist..??

Das mit der Farbe werd ich dann noch schnell ändern...

Code:
public class Zeichenflaeche extends JPanel implements MouseListener, KeyListener{
	
	
	ArrayList list;
	
	int ergebnis=0;
	Point startpoint;
	AbstractFigureFactory factory;
	
	int pressedX;
	int pressedY;
	int releasedX;
	int releasedY;
	
	
	public Zeichenflaeche(){
	
		
		setBackground(Color.WHITE);
		this.addMouseListener(this);
		this.addKeyListener(this);
		list=new ArrayList();
		
		
	}
	
	

	protected void paintComponent(Graphics g){
		
		super.paintComponent(g);
		drawChildren(g);
	}
	
	
	public void drawChildren(Graphics g){
		
		Iterator it=list.iterator();
		
		while(it.hasNext()){
			Figure child=(Figure)it.next();
			child.draw(g);
			
		}
	}
	
	
	public void addFigure(Figure f){
		list.add(f);
	}
	

	
	public void mouseClicked(MouseEvent e) {
	}

	public void mousePressed(MouseEvent e) {
		
	
		startpoint=e.getPoint();
		
		System.out.println("zzzz");
	
	}
	
	
	

	public void mouseReleased(MouseEvent e) {
		
		
		System.out.println("Die Maus wurde gedrückt");
	
		
		switch(ergebnis){
		case 1:
			   factory=new CircleFactory();
			 
			   Figure f=factory.createFigure();
			 
			   f.setColor(Farbe.c);
			 
			   Point zielpoint=e.getPoint();
			   f.setXY(startpoint.x, startpoint.y,zielpoint.x,zielpoint.y);
			   addFigure(f);
			   repaint();
			   break;
			  
			
			
			
		
		case 2: 
			 factory=new RectangleFactory();
			 Figure fg=factory.createFigure();
			 
			 fg.setColor(Farbe.c);
			
			  
			   Point zielpoint2=e.getPoint();
			   fg.setXY(startpoint.x, startpoint.y,zielpoint2.x,zielpoint2.y);
			   addFigure(fg);
			   repaint();
			   break;
		}
	}
	

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void keyTyped(KeyEvent e) {
		
		
		
		char key=e.getKeyChar();
		
		if(key==KeyEvent.VK_ENTER){
			makeFigure1();
			System.out.println("Enter");
		}
		else if(key==KeyEvent.VK_SPACE){
			makeFigure2();
			System.out.println("Leertaste");
		}
		
		
		
	}

	public void keyPressed(KeyEvent e) {	
	}

	public void keyReleased(KeyEvent e) {		
	}
	
	public int makeFigure1(){
		
		ergebnis=1;
		return ergebnis;
		
	}
	
	public int  makeFigure2(){
		
		ergebnis=2;
		return ergebnis;
	}


	
	
}

naja..Hauptsache es geht!

Er zeichnet alle Figuren in allen Farben..wie verlangt!
 

Wildcard

Top Contributor
Und nochmal:
Du darfst in Zeichenfläche in KEINEM FALL FABRIKEN INSTANZIEREN (Konkrete Fabriken sind sowieso Singeltons)!
Sonst könnte man sich die Factory ja direkt sparen...
Du brauchst eine konkrete Fabrik die farbige Figuren erzeugt, und eine die s/w-Figuren erzeugt wenn ich die Aufgabenstellung noch richtig im Kopf hab.
Die einzige Fabrik die du in Zeichenfläche kennen darfst ist die abstrakte Fabrik!!!


Ich glaube das sprengt hier langsam den Rahmen. Wenn du ICQ hast schreib mir mal ne PN mit deiner Nummer dann versuch ich's dir zu erklären...
 

Sindbad1983

Top Contributor
Code:
import java.awt.Color;
import java.awt.Point;

public abstract class AbstractFigureFactory {
	
	AbstractFigureFactory factory;
	
		
	
	public abstract Figure createRectangle(int x, int y, int w, int h, Color c);
	public abstract Figure createCircle(int x, int y, int w, int h, Color c);
	
	public AbstractFigureFactory getInstance(){
		return factory;
	}
	
	public void setCurrentFactory(AbstractFigureFactory factory){
		this.factory=factory;
	}
	

}

Code:
public class ColoredFactory extends AbstractFigureFactory{

	int pressedX;
	int pressedY;
	int releasedX;
	int releasedY;
	Color c;


	
	public Figure createRectangle(int x, int y, int w, int h, Color c) {
		this.pressedX=x;
		this.pressedY=y;
		this.releasedX=w;
		this.releasedY=h;
		this.c=c;
		
		return new Rectangle(pressedX,pressedY,releasedX,releasedY, c);
	}

	public Figure createCircle(int x, int y, int w, int h, Color c) {
		this.pressedX=x;
		this.pressedY=y;
		this.releasedX=w;
		this.releasedY=h;
		this.c=c;
		
		return new Circle(pressedX,pressedY,releasedX,releasedY, c);
	}

	
	

}

Code:
public class BlackAndWhiteFactory extends ColoredFactory {

	
	public Figure createRectangle(int x, int y, int w, int h, Color c) {
		
		if(c!=Color.black){
			System.out.println("Hier wurde eine ColorException ausgelöst");
			return null;
		}
		
		super.createRectangle(h, h, h, h, c);
		return new Rectangle(pressedX,pressedY,releasedX,releasedY, Color.black);
		
		
	}



	
	public Figure createCircle(int x, int y, int w, int h, Color c) {

		if(c!=Color.black){
			System.out.println("Hier wurde eine ColorException ausgelöst");
			return null;
		}
		
		super.createCircle(h, h, h, h, c);
		return new Circle(pressedX,pressedY,releasedX,releasedY, Color.black);
		
	}

}

Code:
public abstract class Figure {
	

	int pressedX;
	int pressedY;
	int releasedX;
	int releasedY;
	Color c;
	
	public abstract void draw (Graphics g);

}

Code:
public class Rectangle extends Figure {
	


	
	public Rectangle(int x, int y, int w, int h, Color c){
		this.pressedX=x;
		this.pressedY=y;
		this.releasedX=w;
		this.releasedY=h;
		this.c=c;
	}
	
	public void draw(Graphics g){
		g.setColor(this.c);
		g.drawRect(pressedX,pressedY,releasedX-pressedX,releasedY-pressedY);
		
	}

}

Code:
public class Circle extends Figure {
	
	public Circle (int x, int y, int w, int h, Color c){
		this.pressedX=x;
		this.pressedY=y;
		this.releasedX=w;
		this.releasedY=h;
		this.c=c;
	}

	
	public void draw(Graphics g) {
		
		g.setColor(this.c);
		g.fillOval(pressedX,pressedY,releasedX-pressedX,releasedY-pressedY);
		
		
	}

}

Code:
public class PaintFrame extends JFrame implements ActionListener{
	
	AbstractFigureFactory factory;
	private Zeichenflaeche zeichenflaeche;
	
	
	
	
	ActionListener listener;
	public PaintFrame(String titel){
		super(titel);
		
		
	
		
		zeichenflaeche=new Zeichenflaeche();
		getContentPane().add(zeichenflaeche); 
	    zeichenflaeche.setSize(getContentPane().getSize()); 
	    zeichenflaeche.setFocusable(true); 
	    zeichenflaeche.requestFocus(); 
	}
	
	
	public void makeMenu(){
		
	MenuBar bar=new MenuBar();
		
		
		 Menu m = new Menu("Look & Feel");
		 MenuItem red=new MenuItem("Red");
		 MenuItem blue=new MenuItem("Blue");
		 MenuItem green=new MenuItem("Green");
		
		 m.add(red);
		 red.addActionListener(this);
		 m.add(blue);
		 blue.addActionListener(this);
		 m.add(green);
		 green.addActionListener(this);
		 bar.add(m);
		 setMenuBar(bar);
		 System.out.println("ccc");
		 
		 
		
	
	}
	
	public void actionPerformed(ActionEvent e) {
                                        
            
	                    //das ist neu!!	
		factory.setCurrentFactory(new ColoredFactory());
		
		
		String me=e.getActionCommand();
	
		
		
		if(me.equals("Red")){
			System.out.println("Rot wurde ausgewählt");
			
			
			
			
		
		}
		else if(me.equals("Blue")){
			System.out.println("Blau wurde ausgewählt");
			
			
			
		}
		else if(me.equals("Green")){
			System.out.println("Grün wurde ausgewählt");
			
			
			
			
			
		}
		
		
	}
	
	public static void main(String [] args){
		PaintFrame frame=new PaintFrame("Zeichenprogramm");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		
		frame.setSize(600,600);
		
		frame.setLocationRelativeTo(null); 
		frame.setVisible(true);
		frame.makeMenu();
		

		

			
	}

}

und natürlich Zeichenflaeche noch als eigene Klasse
 

Wildcard

Top Contributor
Hab mir gerade nochmal die Aufgabenstellung durchgelesen.
Dachte das Color/S/W währe vorgeben, aber das hast du dir ja rausgesucht. Ist etwas ungeschickt, da die Color-Factory schon alles leistet was die S/W kann.
Währ deshalb besser eine andere Factory zu nehmen, beispielsweise eine die die Figuren auch ausfüllt, oder dickere Striche zeichnet.
Auserdem sollten deine konkreten Factorys Singeltons sein.

Code:
public class ColoredFactory extends AbstractFigureFactory{

//entfern die Klassenvariablen, die sind unnötig.
   int pressedX;
   int pressedY;
   int releasedX;
   int releasedY;
   Color c;


   
   public Figure createRectangle(int x, int y, int w, int h, Color c) {
      this.pressedX=x;
      this.pressedY=y;
      this.releasedX=w;
      this.releasedY=h;
      this.c=c;
      
      return new Rectangle(pressedX,pressedY,releasedX,releasedY, c);
   }

   public Figure createCircle(int x, int y, int w, int h, Color c) {
      this.pressedX=x;
      this.pressedY=y;
      this.releasedX=w;
      this.releasedY=h;
      this.c=c;
      
      return new Circle(pressedX,pressedY,releasedX,releasedY, c);
   }
}
 

Sindbad1983

Top Contributor
Code:
class Zeichenflaeche extends JPanel implements MouseListener , KeyListener
{ 
   private ArrayList children = new ArrayList(); 
    
   private Point startpoint;
   private Point endpoint;
   
   int pressedX;
   int pressedY;
   int releasedX;
   int releasedY;
    
   public Zeichenflaeche() 
   { 
      addMouseListener(this); 
   } 
    
   protected void paintComponent(Graphics g) 
   { 
      super.paintComponent(g); 
      drawChildren(g); 
   } 

   private void addFigure(Figure f) 
   { 
      children.add(f); 
   } 
  
   private void drawChildren(Graphics g) 
   { 
      Iterator it = children.iterator(); 
      while (it.hasNext()) 
      { 
         Figure child = (Figure) it.next(); 
         child.draw(g); 
          
      } 
       
   } 

  
   public void mouseClicked(MouseEvent e) 
   { 
     
       
   } 

   public void mousePressed(MouseEvent e) 
   { 
      startpoint = e.getPoint(); 
      pressedX=startpoint.x;
      pressedY=startpoint.y;
       
   } 

  
   public void mouseReleased(MouseEvent e){ 
	   
	   endpoint=e.getPoint();
	   releasedX=endpoint.x;
	   releasedY=endpoint.y;
	   
      repaint(); 
       
   } 

   public void mouseEntered(MouseEvent e) 
   { 
     
   } 

   
   public void mouseExited(MouseEvent e) 
   { 
    
       
   }

   public void keyTyped(KeyEvent e) {

	
   }

   public void keyPressed(KeyEvent e) {
	   
	   char test=e.getKeyChar();
	   
	   if(test==KeyEvent.VK_ENTER){
			System.out.println("Enter");
		   addFigure(AbstractFigureFactory.getInstance().createCircle(pressedX,pressedY,releasedX,releasedY,Color.blue));
		   
	   }
	   else if(test==KeyEvent.VK_SPACE){
			System.out.println("Leertaste");
		   addFigure(AbstractFigureFactory.getInstance().createRectangle(pressedX,pressedY,releasedX,releasedY,Color.blue));
	   }
	   
	   repaint();
	   
	
	
   }

   public void keyReleased(KeyEvent e) {
	
	
   } 
    
}

könnte die keyPressed Methode so funktionieren?
ist das die richtige Anwendung?

als Farbe hab ich jetzt einfach mal blau genommen..da muss ich mir noch Gedanken drüber machen!
Versteh ich noch nicht ganz, wie ich das PaintFrame die ausgewählte Farbe in die keyPressed-Methode (Color c) reinbekomm...
 

Sindbad1983

Top Contributor
Code:
import java.awt.Color;
import java.awt.Point;

public abstract class AbstractFigureFactory {
	
	private static AbstractFigureFactory factory;
	Color c;
	

	
	public abstract Figure createRectangle(int x, int y, int w, int h, Color c);
	public abstract Figure createCircle(int x, int y, int w, int h, Color c);
	
	public static AbstractFigureFactory getInstance(){
		return factory;
	}
	
	public static void setCurrentFactory(AbstractFigureFactory factory){
		AbstractFigureFactory.factory=factory;
	}
	

}



Code:
public class ColoredFactory extends AbstractFigureFactory{

	int pressedX;
	int pressedY;
	int releasedX;
	int releasedY;
	Color c;
	
	public static final ColoredFactory INSTANCE=new ColoredFactory();
	
	public ColoredFactory(){
		
	}


	
	public Figure createRectangle(int x, int y, int w, int h, Color c) {
		this.pressedX=x;
		this.pressedY=y;
		this.releasedX=w;
		this.releasedY=h;
		this.c=c;
		
		return new Rectangle(pressedX,pressedY,releasedX,releasedY, c);
	}

	public Figure createCircle(int x, int y, int w, int h, Color c) {
		this.pressedX=x;
		this.pressedY=y;
		this.releasedX=w;
		this.releasedY=h;
		this.c=c;
		
		return new Circle(pressedX,pressedY,releasedX,releasedY, c);
	}

	
	

}

Code:
public class BlackAndWhiteFactory extends ColoredFactory {
	
	public static final BlackAndWhiteFactory INSTANCE=new BlackAndWhiteFactory();
	
	public BlackAndWhiteFactory(){
	}

	
	public Figure createRectangle(int x, int y, int w, int h, Color c) {
		
		if(c!=Color.black){
			System.out.println("Hier wurde eine ColorException ausgelöst");
			return null;
		}
		
		super.createRectangle(h, h, h, h, c);
		return new Rectangle(pressedX,pressedY,releasedX,releasedY, Color.black);
		
		
	}



	
	public Figure createCircle(int x, int y, int w, int h, Color c) {

		if(c!=Color.black){
			System.out.println("Hier wurde eine ColorException ausgelöst");
			return null;
		}
		
		super.createCircle(h, h, h, h, c);
		return new Circle(pressedX,pressedY,releasedX,releasedY, Color.black);
		
	}

}

Code:
public abstract class Figure {
	

	int pressedX;
	int pressedY;
	int releasedX;
	int releasedY;
	Color c;
	
	public abstract void draw (Graphics g);

}

Code:
public class Rectangle extends Figure {
	


	
	public Rectangle(int x, int y, int w, int h, Color c){
		this.pressedX=x;
		this.pressedY=y;
		this.releasedX=w;
		this.releasedY=h;
		this.c=c;
	}
	
	public void draw(Graphics g){
		g.setColor(this.c);
		g.drawRect(pressedX,pressedY,releasedX-pressedX,releasedY-pressedY);
		
	}

}

Code:
public class Circle extends Figure {
	
	public Circle (int x, int y, int w, int h, Color c){
		this.pressedX=x;
		this.pressedY=y;
		this.releasedX=w;
		this.releasedY=h;
		this.c=c;
	}

	
	public void draw(Graphics g) {
		
		g.setColor(this.c);
		g.fillOval(pressedX,pressedY,releasedX-pressedX,releasedY-pressedY);
		
		
	}

}

Code:
public class PaintFrame extends JFrame implements ActionListener{
	
	AbstractFigureFactory factory;
	private Zeichenflaeche zeichenflaeche;
	
	
	
	
	ActionListener listener;
	public PaintFrame(String titel){
		super(titel);
		
		factory.setCurrentFactory(new BlackAndWhiteFactory());
		
		
	
		
		zeichenflaeche=new Zeichenflaeche();
		getContentPane().add(zeichenflaeche); 
	    zeichenflaeche.setSize(getContentPane().getSize()); 
	    zeichenflaeche.setFocusable(true); 
	    zeichenflaeche.requestFocus(); 
	}
	
	
	public void makeMenu(){
		
	MenuBar bar=new MenuBar();
		
		
		 Menu m = new Menu("Look & Feel");
		 MenuItem red=new MenuItem("Red");
		 MenuItem blue=new MenuItem("Blue");
		 MenuItem green=new MenuItem("Green");
		
		 m.add(red);
		 red.addActionListener(this);
		 m.add(blue);
		 blue.addActionListener(this);
		 m.add(green);
		 green.addActionListener(this);
		 bar.add(m);
		 setMenuBar(bar);
		 System.out.println("ccc");
		 
		 
		
	
	}
	
	public void actionPerformed(ActionEvent e) {
		
		factory.setCurrentFactory(new ColoredFactory());
		
		
		String me=e.getActionCommand();
	
		
		
		if(me.equals("Red")){
			System.out.println("Rot wurde ausgewählt");
			
			
			
			
		
		}
		else if(me.equals("Blue")){
			System.out.println("Blau wurde ausgewählt");
			
			
			
		}
		else if(me.equals("Green")){
			System.out.println("Grün wurde ausgewählt");
			
			
			
			
			
		}
		
		
	}
	
	public static void main(String [] args){
		PaintFrame frame=new PaintFrame("Zeichenprogramm");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		
		frame.setSize(600,600);
		
		frame.setLocationRelativeTo(null); 
		frame.setVisible(true);
		frame.makeMenu();
		

		

			
	}

}

Code:
class Zeichenflaeche extends JPanel implements MouseListener , KeyListener
{ 
   private ArrayList children = new ArrayList(); 
    
   private Point startpoint;
   private Point endpoint;
   
   int pressedX;
   int pressedY;
   int releasedX;
   int releasedY;
    
   public Zeichenflaeche() 
   { 
      addMouseListener(this); 
      addKeyListener (this);
   } 
    
   protected void paintComponent(Graphics g) 
   { 
      super.paintComponent(g); 
      drawChildren(g); 
   } 

   private void addFigure(Figure f) 
   { 
      children.add(f); 
   } 
  
   private void drawChildren(Graphics g) 
   { 
      Iterator it = children.iterator(); 
      while (it.hasNext()) 
      { 
         Figure child = (Figure) it.next(); 
         child.draw(g); 
          
      } 
       
      
   } 

  
   public void mouseClicked(MouseEvent e) 
   { 
     
       
   } 

   public void mousePressed(MouseEvent e) 
   { 
      startpoint = e.getPoint(); 
      pressedX=startpoint.x;
      pressedY=startpoint.y;
       
   } 

  
   public void mouseReleased(MouseEvent e){ 
	   
	   endpoint=e.getPoint();
	   releasedX=endpoint.x;
	   releasedY=endpoint.y;
	   
    
       
   } 

   public void mouseEntered(MouseEvent e) 
   { 
     
   } 

   
   public void mouseExited(MouseEvent e) 
   { 
    
       
   }

   public void keyTyped(KeyEvent e) {

	
   }

   public void keyPressed(KeyEvent e) {
	   
	   char test=e.getKeyChar();
	   
	   if(test==KeyEvent.VK_ENTER){
			System.out.println("Enter");
		   addFigure(AbstractFigureFactory.getInstance().createCircle(pressedX,pressedY,releasedX,releasedY,Color.blue));
		   
	   }
	   else if(test==KeyEvent.VK_SPACE){
			System.out.println("Leertaste");
		   addFigure(AbstractFigureFactory.getInstance().createRectangle(pressedX,pressedY,releasedX,releasedY,Color.blue));
	   }
	   
	   repaint();
	   
	   
	
	
   }

   public void keyReleased(KeyEvent e) {
	
	
   } 
    
}
 

Wildcard

Top Contributor
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JPanel;

/**
 * 
 */

/**
 * @author Wildcard created at 14.06.2005
 */
class Zeichenflaeche extends JPanel
{
	private ArrayList children = new ArrayList();

	private Point startpoint;

	private Point endpoint;

	private static final int RECTANGLE = 1;

	private static final int CIRCLE = RECTANGLE + 1;

	/** per default */
	private int choice = RECTANGLE;

	int pressedX;

	int pressedY;

	int releasedX;

	int releasedY;

	public Zeichenflaeche()
	{
		addMouseListener(new MouseAdapter() {

			public void mouseReleased(MouseEvent e)
			{
				endpoint = e.getPoint();
				releasedX = endpoint.x;
				releasedY = endpoint.y;

				if (choice == RECTANGLE)
					addFigure(AbstractFigureFactory.getInstance()
							.createRectangle(pressedX, pressedY, releasedX,
									releasedY, Color.blue));
				else if (choice == CIRCLE)
					addFigure(AbstractFigureFactory.getInstance().createCircle(
							pressedX, pressedY, releasedX, releasedY,
							Color.blue));
				repaint();
			}

			public void mousePressed(MouseEvent e)
			{
				startpoint = e.getPoint();
				pressedX = startpoint.x;
				pressedY = startpoint.y;
			}

		});
		addKeyListener(new KeyAdapter() {

			public void keyTyped(KeyEvent e)
			{
				if (e.getKeyChar() == KeyEvent.VK_ENTER)
					choice = CIRCLE;
				else if (e.getKeyChar() == KeyEvent.VK_SPACE)
					choice = RECTANGLE;
			}

		});
	}

	protected void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		drawChildren(g);
	}

	private void addFigure(Figure f)
	{
		children.add(f);
	}

	private void drawChildren(Graphics g)
	{
		Iterator it = children.iterator();
		while (it.hasNext())
		{
			Figure child = (Figure) it.next();
			child.draw(g);

		}

	}

}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben