100 likes | 183 Views
Implementierung der Graphik in EMMA301Paint. In EMMA301Paint sind nun wesentlich Funktionen implementiert: Fenster zum Zeichnen graphischer Objekte Graphische Objekte Darstellungsarten für graphische Objekte
E N D
Implementierung der Graphik in EMMA301Paint 08-GraphikImplementierung
In EMMA301Paint sind nun wesentlich Funktionen implementiert: • Fenster zum Zeichnen graphischer Objekte • Graphische Objekte • Darstellungsarten für graphische Objekte • Es fehlt noch die Möglichkeit graphische Objekte zu erzeugen und zu bearbeiten. Was muss implementiert werden: • Auswahl welche Art Objekt erzeugt werden soll (Button, Menü, Popup-Menü) • Eingabe der für diese Objekt nötigen Daten (Koordinateneingabe mit Hilfe der Mouse und Anzeige der Zwischenstände) • Erzeugung des Objektes • Zuordnung des Objektes zu einer Graphik • Beispiel: Erzeugen eines Linien-Objektes 08-GraphikImplementierung
Einfügen in die GUI • Um verschiedene Objekte erzeugen zu können, wird eine globale Variable paintType eingerichtet, die die Information darüber aufnimmt: public static final int PAINT_NOTHING=0; public static final int PAINT_LINE=1; public static final int PAINT_RECTANGLE=2; public static final int PAINT_OVAL=3; public static final int PAINT_POLYLINE=4; public static final int PAINT_POLYGON=5; private int paintType = PAINT_NOTHING; • Globale Action-Variable: private Action lineAction; lineAction = new Action(parent, 9, "Linie", "pictures/line.gif", "Zeichnen einer Linie", 'l'); 08-GraphikImplementierung
Einfügen in den Tools-Bar, das Menü und das Popup-Menü: toolsBar.add(createButton(lineAction)); toolsMenu.add(new JMenuItem(lineAction)); popupMenu.add(new JMenuItem(lineAction)); • Auswertung der Actions: public void actionPerformed(ActionEvent e) { switch (typ) { case 9: paintType=PAINT_LINE; break; } } 08-GraphikImplementierung
Eingabe der Daten • Daten bestehen aus den Koordinaten des Anfangspunktes und des Endpunktes. • Welchen Algorithmus will man verwenden? • Mouse ohne gedrückte linker Taste zum Anfangspunkt der Linie bewegen. • Mouse-Taste drücken Koordinaten des Punktes werden als Anfangspunkt (x1, y1) gespeichert. • Mouse mit gedrückter linker Taste zum Endpunkt bewegenbei jedem Punkt wird ein temporäres graphisches Objekt erzeugt, das als Linie angezeigt wird. • Am Endpunkt wird die Mouse-Taste losgelassenDie Koordinaten werden als Endpunkt (x2,y2) der Line gespeichert, es wird das Line-Objekt erzeugt und dem aktuellen EMMA301PaintFrame hizugefügt. 08-GraphikImplementierung
Es ist keine Programmierung erforderlich • Globale Variable für die Speicherung der Koordinatenprivate int x1, y1, x2, y2;Methode zur Implementierung des MouseListenerspublic void mousePressed(MouseEvent e){ x1=e.getX(); y1=e.getY();} • Methode zur Implementierung des MouseMotionListenerspublic void mouseDragged(MouseEvent e){ int x2=e.getX(); int y2=e.getY(); EMMA301PaintFrame selectedIF = (EMMA301PaintFrame)desktopPane.getSelectedFrame(); switch (paintType) {case PAINT_LINE: selectedIF.setTemporaryGraphicalObject( new Line(activeStroke, activeColor, x1, y1, x2, y2)); break;}} 08-GraphikImplementierung
Methode zur Implementierung des MouseListenerspublic void mouseReleased(MouseEvent e){ x2=e.getX(); y2=e.getY(); EMMA301PaintFrame selectedIF = (EMMA301PaintFrame)desktopPane.getSelectedFrame(); switch (paintType) {case PAINT_LINE: selectedIF.addGraphicalObject(new Line (activeStroke, activeColor, x1, y1, x2, y2)); break;}} 08-GraphikImplementierung
Temporäre Darstellung • Bei der Eingabe der Daten müssen kontinuierlich die Zwischenergebnisse angezeigt werden. Diese muss schnell und präzise seines werden die paintRaw-Methoden del GraphicalObject‘s verwendet. • Wenn man diese Zwischenergebnisse kontinuierlich mit den schon definierten graphischen Objekte zusammen im selben Graphik-Kontext darstellen würde könnte das sehr langsam sein. • Ausweg: die schon fertigen Objekte werden im Graphik-Kontext des ContentPane dargestellt und das temporäre Objekt im Graphik-Kontext der GlassPane. 08-GraphikImplementierung
private GraphicalObject tempGraphic = null; setGlassPane(new JPanel() { { setOpaque(false); } public void paintComponent(Graphics g) { super.paintComponent(g); paintTempGraphics((Graphics2D)g); } }); public void paintTempGraphics (Graphics2D g) { if (tempGraphic!=null) tempGraphic.paintRaw(g); } 08-GraphikImplementierung
public void setTemporaryGraphicalObject (GraphicalObject graphicalObject) { tempGraphic = graphicalObject; getGlassPane().setVisible(true); getGlassPane().repaint(); } public void removeTemporaryGraphicalObject() { tempGraphic = null; getGlassPane().setVisible(false); } 08-GraphikImplementierung