Malprogramm (Kreise u. Rechtecke aufziehen). Verbesserungsvorschläge?



  • Hallo zusammen!

    Sollte ein Malprogramm erstellen, mit dem man Rechtecke und Kreise aufziehen kann.
    Kann mir jemand sagen, ob mein Programm auch von der Theorie her (OOP, Ereignisbehandlung, etc.) so in Ordnung ist? Oder gehts noch besser?
    (Alles AWT. Swing und Java2D wurde bewusst nicht verwendet)
    Vielen Dank schon mal!

    public class MainAppl {
    	public static void main(String[] args) {
    		new MyFrame("Aufgabe1");
    	}
    }
    
    import java.awt.*;
    
    // Abstrakte Klasse GeoObject
    public abstract class GeoObject {
    	private Point position;
    	private Dimension size;
    
    	// Konstruktor
    	public GeoObject() {
    		position = new Point(0, 0);
    		size = new Dimension(0, 0);
    	}
    
    	// Startpunkt zurückgeben
    	public Point getPos() {
    		return position;
    	}
    
    	// Größe zurückgeben
    	public Dimension getSize() {
    		return size;
    	}
    
    	// Startpunkt setzen
    	public void setPos(int x, int y) {
    		position.x = x;
    		position.y = y;
    	}
    
    	// Größe setzen
    	public void setSize(int width, int height) {
    		size.width  = width;
    		size.height = height;
    	}
    
    	// Abstrakte Methode draw
    	public abstract void draw(Graphics g);
    }
    
    import java.awt.*;
    
    public class Kreis extends GeoObject {
    	// Konstruktoren
    	Kreis() { }
    
    	Kreis(int x, int y) {
    		this.setPos(x, y);
    	}
    
    	// Zeichenmethode implementieren
    	public void draw(Graphics g) {
    		g.drawOval(
    				getPos().x,
    				getPos().y,
    				getSize().width,
    				getSize().height
    		);
    	}
    }
    
    import java.awt.*;
    
    public class Rechteck extends GeoObject {
    	//Konstruktoren
    	Rechteck() { }
    
    	Rechteck(int x, int y) {
    		this.setPos(x, y);
    	}
    
    	// Zeichenmethode implementieren
    	public void draw(Graphics g) {
    		g.drawRect(
    				getPos().x,
    				getPos().y,
    				getSize().width,
    				getSize().height
    		);
    	}
    }
    
    import java.awt.*;
    import java.awt.event.*;
    
    public class MyFrame extends Frame {
    	private MyCanvas canvas = new MyCanvas();
    	private MyPanel panel = new MyPanel(canvas);
    
    	MyFrame(String title) {
    		super(title);
    
    		setBackground(Color.LIGHT_GRAY);
    
    		// Panel mit Buttons und Zeichenfläche hinzufügen
    		add(panel,  BorderLayout.NORTH);
    		add(canvas, BorderLayout.CENTER);
    
    		// Größe des Fensters anpassen
    		pack();
    
    		setVisible(true);
    
    		// Schließen-Ereignis verarbeiten
    		addWindowListener(
    			new WindowAdapter() {
    				public void windowClosing(WindowEvent e) {
    					e.getWindow().dispose();
    					System.exit(0);
    				}
    			}
    		);
    	}
    }
    
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    
    public class MyCanvas extends Canvas implements
    	MouseListener, MouseMotionListener, ActionListener, ItemListener {
    	private Vector<GeoObject> GeoObjects;
    	private final int RECHTECK = 0;
    	private final int KREIS = 1;
    	private final int SICHTBAR = 0;
    	private final int UNSICHTBAR = 1;
    	private int Zeichenobjekt;
    	private int Zeichenoption;
    	private int startX, startY, tmpX, tmpY, radius;
    
    	// Konstruktor
    	MyCanvas() {
    		GeoObjects = new Vector<GeoObject>();
    		Zeichenobjekt = RECHTECK;
    		Zeichenoption = SICHTBAR;
    		setSize(640, 480);
    		setBackground(Color.WHITE);
    		setForeground(Color.BLUE);
    		addMouseListener(this);
    		addMouseMotionListener(this);
    	}
    
    	public void paint(Graphics g) {
    		// Objekte zeichnen
    		for(Iterator<GeoObject> it = GeoObjects.iterator(); it.hasNext(); ) {
    			it.next().draw(g);
    		}
    	}
    
    	public void mousePressed(MouseEvent e) {
    		if(Zeichenoption == SICHTBAR) {
    			// Neues Objekt anlegen
    			if(Zeichenobjekt == RECHTECK)
    				GeoObjects.add(new Rechteck(startX = e.getX(), startY = e.getY()));
    			else
    				GeoObjects.add(new Kreis(startX = e.getX(), startY = e.getY()));
    		}
    	}
    
    	public void mouseDragged(MouseEvent e) {
    		if(Zeichenoption == SICHTBAR) {
    			if(Zeichenobjekt == RECHTECK) {
    				tmpX = e.getX();
    				tmpY = e.getY();
    
    				// Zeichenrichtung links unten
    				if(tmpX < startX && tmpY > startY) {
    					GeoObjects.lastElement().setPos(tmpX, startY);
    					GeoObjects.lastElement().setSize(startX-tmpX, tmpY-startY);
    				}
    				// rechts unten
    				else if(tmpX >= startX && tmpY > startY) {
    					GeoObjects.lastElement().setSize(tmpX-startX, tmpY-startY);
    				}
    				// rechts oben
    				else if(tmpX >= startX && tmpY < startY) {
    					GeoObjects.lastElement().setPos(startX, tmpY);
    					GeoObjects.lastElement().setSize(tmpX-startX, startY-tmpY);	
    				}
    				// links oben
    				else {
    					GeoObjects.lastElement().setPos(tmpX, tmpY);
    					GeoObjects.lastElement().setSize(startX-tmpX, startY-tmpY);	
    				}
    			}
    			// Kreis berechnen
    			else {
    				// Zeichenrichtung links unten/oben
    				if(e.getX() < startX) {
    					radius = startX-e.getX();
    					GeoObjects.lastElement().setPos(startX-radius, startY-radius);
    					GeoObjects.lastElement().setSize(radius+radius, radius+radius);
    				}
    				// rechts unten/oben
    				else {
    					radius = e.getX()-startX;
    					GeoObjects.lastElement().setPos(startX-radius, startY-radius);
    					GeoObjects.lastElement().setSize(radius+radius, radius+radius);
    				}
    			}		
    
    			// Neuzeichnen
    			repaint();
    		}
    	}
    
    	public void actionPerformed(ActionEvent e) {
    		// Objekte löschen
    		GeoObjects.clear();
    		// Neuzeichnen
    		repaint();
    	}
    
    	public void itemStateChanged(ItemEvent e) {
    		// Prüfen welcher Radiobutton aktiviert wurde 
    		if(e.getItem().toString() == "Rechteck")
    			Zeichenobjekt = RECHTECK;
    		else if(e.getItem().toString() == "Kreis")
    			Zeichenobjekt = KREIS;
    		else if(e.getItem().toString() == "Sichtbar") {
    			Zeichenoption = SICHTBAR;
    			setForeground(Color.BLUE);
    
    			// Neuzeichnen
    			repaint();
    		}
    		else {
    			Zeichenoption = UNSICHTBAR;
    			setForeground(getBackground());
    
    			// Neuzeichnen
    			repaint();
    		}
    	}
    
    	public void mouseClicked(MouseEvent e) {
    
    	}
    
    	public void mouseEntered(MouseEvent e) {
    
    	}
    
    	public void mouseExited(MouseEvent e) {
    
    	}
    
    	public void mouseReleased(MouseEvent e) {
    
    	}
    
    	public void mouseMoved(MouseEvent e) {
    
    	}
    }
    
    import java.awt.*;
    
    public class MyPanel extends Panel {
    	private CheckboxGroup cbgOptions, cbgObjects;
    	private Checkbox cbRechteck, cbKreis, cbSichtbar, cbUnsichtbar;
    	private Panel OptionsPanel, ObjectsPanel;
    	private Button btnDelete;
    
    	// Konstruktor
    	MyPanel(MyCanvas canvas) {
    		OptionsPanel = new Panel();
    		ObjectsPanel = new Panel();
    		cbgOptions   = new CheckboxGroup();
    		cbgObjects   = new CheckboxGroup();
    		btnDelete    = new Button("Löschen");
    		cbRechteck   = new Checkbox("Rechteck",   true,  cbgObjects);
    		cbKreis      = new Checkbox("Kreis",      false, cbgObjects);
    		cbSichtbar   = new Checkbox("Sichtbar",   true,  cbgOptions);
    		cbUnsichtbar = new Checkbox("Unsichtbar", false, cbgOptions);
    
    		// Listener anmelden
    		cbRechteck.addItemListener(canvas);
    		cbKreis.addItemListener(canvas);
    		cbSichtbar.addItemListener(canvas);
    		cbUnsichtbar.addItemListener(canvas);
    
    		btnDelete.addActionListener(canvas);
    
    		// Oberflächenelemente hinzufügen
    		ObjectsPanel.add(cbRechteck);
    		ObjectsPanel.add(cbKreis);
    		OptionsPanel.add(cbSichtbar);
    		OptionsPanel.add(cbUnsichtbar);
    
    		// Hintergrundfarbe setzen
    		ObjectsPanel.setBackground(Color.GREEN);
    		OptionsPanel.setBackground(Color.YELLOW);
    
    		add(ObjectsPanel);
    		add(OptionsPanel);
    		add(btnDelete);
    	}
    }
    


  • habs mal so ein bisschen überflogen. was man noc machen könnte wäre einmal eine art factory-klasse die dir die geoobjecte erstellt und den zustand welches erstellt werden soll gesetzt bekommt. und eine klasse die fürs positionieren zuständig ist. diese ganz logik wie die objecte erzeugt und platziert werden aus dem mouselistener raus in klassen, dann kann mans schneller einfügen, wenn z.b die tastatur auch genutzt werden soll. einfach ui und logik mehr entkoppeln.



  • hallo ich hatte mal auf java-forum.org/de ein tutorial gesehen in diesem tutorial wurde ein malprogramm erstellt ich finde aber leider den text nicht musste mal selber suchen ich schaue heute abend nochmal in meine linksammlung
    cu




Anmelden zum Antworten