import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; /** * Zweck: Fuer Praesenzuebung zu verwendende Klasse, die den Rahmen * bietet, um geometrische Figuren auf dem Bildschirm anzeigen * zu lassen.
* Der Rahmen besteht dabei aus den Klassen Grafik und Figur. */ public class Grafik { private JFrame frame; private JPanel panel; private ArrayList figuren = new ArrayList(); /** * Oeffnet ein Grafikfenster mit einer Zeichenflaeche der angegebenen * Breite und Hoehe. * * @param width * Breite der Zeichenflaeche * @param height * Hoehe der Zeichenflaeche */ public Grafik(int width, int height) { this.frame = new JFrame(); this.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.panel = new JPanel() { @Override public void paint(Graphics g) { super.paint(g); for (int i = 0; i < Grafik.this.figuren.size(); i++) { Grafik.this.figuren.get(i).paint(g); } } }; this.panel.setPreferredSize(new Dimension(width, height)); this.frame.add(this.panel); this.frame.pack(); this.frame.setVisible(true); } /** * Aktualisiert die Zeichenflaeche. Aenderungen werden erst sichtbar, nachdem * diese Methode aufgerufen wurde. Vor der Aktualisierung wird ms Millisekunden * gewartet.
* Damit ist eine einfache Animation moeglich. * * @param verzoegerung * Zeit in Millisekunden, die vor der Aktualisierung gewartet wird. */ public void aktualisiere(int verzoegerung) { // frame.repaint(); try { Thread.sleep(verzoegerung); SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { Grafik.this.panel.paint(Grafik.this.panel.getGraphics()); } }); } catch (InterruptedException e) { } catch (InvocationTargetException e) { } } /** * Diese Methode fuegt die uebergebene Figur in die Zeichenflaeche ein. * * @param f * in die Zeichenflaeche einzufuegende Figur */ public void add(Figur f) { this.figuren.add(f); } /** * Mit dieser Methode wird die uebergebene Figur von der Zeichenflaeche entfernt * * @param f zu entfernende Figur */ public void remove(Figur f) { this.figuren.remove(f); } } abstract class Figur { /** * Gibt die Anzahl an Punkten zurueck. Es handelt sich um eine abstrakte Methode * die in allen Unterklassen von Figur ueberschrieben werden muss * * @return Punktanzahl */ public abstract int getPunktCount(); /** * Gibt den zum index gehoerenden Punkt zurueck. Es handelt sich um eine * abstrakte Methode die in allen Unterklassen von Figur überschrieben werden * muss * * @param i Punktindex * @return Punkt an der Stelle i */ public abstract Point getPunkt(int i); /** * Diese Methode zeichnet zwischen den jeweils benachbarten Punkten der Liste * eine Verbindungslinie. * * @param g * Graphikobjekt, auf dem die Punkte der Figur eingezeichnet werden */ public void paint(Graphics g) { for (int i = 0; i < getPunktCount() - 1; i++) { g.drawLine(getPunkt(i).x, getPunkt(i).y, getPunkt(i + 1).x, getPunkt(i + 1).y); } } /** * Alle Punkte der Figur werden um die angegebenen Werte verschoben. * * @param x * Verschiebungswert in x-Richtung * @param y * Verschiebungswert in y-Richtung */ public void verschiebe(int x, int y) { for (int i = 0; i < getPunktCount(); i++) { getPunkt(i).translate(x, y); } } @Override public String toString() { return "Leere Figur:"; } }