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
-
hallo ich habe es gefunden
http://www.java-forum.org/de/viewtopic.php?t=15778
cu