UNDO & SELECT

17
UNDO & SELECT Vortrag : Martin Hiersche 21.12.1999

description

UNDO & SELECT. Vortrag : Martin Hiersche 21.12.1999. UNDO. Das Problem. Bei dem Zeichenprogramm Paint 31 hatten wir die Möglichkeit zu Zeichnen, Schriften hinzuzufügen usw. Das Problem war bis dahin, wenn man sich geirrt hatte müßte man das ganze Bild neu zeichnen und bearbeiten. - PowerPoint PPT Presentation

Transcript of UNDO & SELECT

Page 1: UNDO & SELECT

UNDO&

SELECT

Vortrag : Martin Hiersche

21.12.1999

Page 2: UNDO & SELECT

DVG3 - Mh001 2

UNDO

Page 3: UNDO & SELECT

DVG3 - Mh001 3

Das Problem

Bei dem Zeichenprogramm Paint 31 hatten wir die Möglichkeit zu Zeichnen, Schriften hinzuzufügen usw.

Das Problem war bis dahin, wenn man sich geirrt hatte müßte man das ganze Bild neu zeichnen und bearbeiten.

Die einfachste Lösung wäre, wenn man die letzte Aktion rückgängig machen könnte und somit das bis dahin gezeichnete nicht unbrauchbar wird bzw das man das weiter verwenden kann.

Page 4: UNDO & SELECT

DVG3 - Mh001 4

Die Idee

.. besteht darin das Zeichenprogramm so zu modifizieren, daß man Fehler oder besser die letzten Aktionen die man ausgeführt hat, rückgängig macht und somit das bis dahin gezeichnete Bild noch weiterhin zu Verfügung steht.

Weiterhin sollte das „Rückgängig machen“ nicht nur von der letzten Aktion sein, sondern es sollte auch die davor ausgeführten Aktionen genau so behandelt werden können. Damit man Schritt für Schritt die Elemente die dem Bild hinzugefügt wurden löschen kann.

Page 5: UNDO & SELECT

DVG3 - Mh001 5

Die Lösung

Als erstes definiert man in der Class Pain.java in der Methode

private void createStatus(MenuBar menu){Menu optionsMenu = new Menu("Options");menu.add(optionsMenu);...optionsMenu.add(new MenuItem("undo", new MenuShortcut('u')));

Den Knopf / Button „undo“ wird in der Menubar unter der Rubrik „Option“ hizugefügt. Nun kann man die Option „undo“ auch mit der tastenkombination „Strg + u“ aufrufen.

Weiterhin soll der Button auch als Arbeitswerkzeug sichtbar sein. Deswegen wird der Knopf auf der Benutzeroberfläche

hinausgezogen.

Page 6: UNDO & SELECT

DVG3 - Mh001 6

Die Anweisung sieht wie folgt aus GraphicButton undoButton = new

GraphicButton(Toolkit.getDefaultToolkit().getImage("images/undo.gif"),"undo");statusPanel.add(undoButton,gbc);undoButton.addActionListener(this);

Nachdem man den Knopf definiert hat muß man auch das ActionEvent definieren.

Page 7: UNDO & SELECT

DVG3 - Mh001 7

In der Methode public void actionPerformed(ActionEvent e)

{ ... Muß folgendes eingefügt werden:

case 'u': graph.delLast(); offGraphics.setColor(Color.white);offGraphics.fillRect(0,0,1000,1000); offGraphics.setColor(Color.black);graph.paint(offGraphics);

gPanel.paint(onGraphics);break;

Page 8: UNDO & SELECT

DVG3 - Mh001 8

Weiterhin muß man in der Class Paint.graph die Methode delLast einfügen :

public void delLast(){

list.removeLast();}

removeLast löscht den letzten Eintrag in der Liste. Anschließend wird das Bild zurückgegeben und neu gezeichnet.

Page 9: UNDO & SELECT

DVG3 - Mh001 9

Ausnahmen

Um die Aktion fehlerfrei ausführen zu können und vor Leuten zu schützen, die gerne auch was eliminieren wollen was nicht mehr vorhanden ist, muß man die Ausnahmen abfangen.

Im folgenden ist es nichts weiter als das man einen try-catch -Block um die Methode definiert.

case 'u':try{......}catch(java.util.NoSuchElementException nsee){}

Somit ist die Methode „undo“ in das Zeichenprogramm Paint 31 mit eingebracht.

Page 10: UNDO & SELECT

DVG3 - Mh001 10

SELECT

Page 11: UNDO & SELECT

DVG3 - Mh001 11

Das Problem

Bis jetzt kann man schon die letzte Aktion rückgängig machen . In dem Programm kann man noch keine direkte Auswahl von

bestimmten Objekten vornehmen. Man möchte mit der Maus ein bestimmtes Objekt aussuchen

und dann das Ausgesuchte weiter bearbeiten. Was soll die Aktion SELECT überhaupt bewirken oder was soll

überhaupt geschehen?

Page 12: UNDO & SELECT

DVG3 - Mh001 12

Die Lösung Als erstes definiert man einen Knopf „select“ in Paint GraphicButton selectButton =

new GraphicButton(Toolkit.getDefaultToolkit().getImage("images/select.gif"),"select");statusPanel.add(selectButton,gbc);

selectButton.addActionListener(this);

Weiterhin muß beachtet werden das man im Selectiermodus die Befehle anders aufwertet.

Deshalb definiert man eine boolean Variable als Schalter (später) private boolean selectMode = false; In der Methode wird die Zeile hinzugefügt.

private void createStatus(MenuBar menu) optionsMenu.add(new MenuItem("select", new

MenuShortcut('x')));

Page 13: UNDO & SELECT

DVG3 - Mh001 13

In der Methode public void actionPerformed(ActionEvent e) muß man jetzt folgendes beachten .

Man hat zum Anfang den Selectmodus auf false gesetzt. Mit der Anweisung case 'x':selectMode=!selectMode;break; wird der

Selectmodus auf true oder auf false gesetzt . Aber warum ? Um später die ausgesuchten Objekte weiter zu bearbeiten, muß

man im Selectmodus die weiteren Aktionen unterscheiden Nun muß man bei den MouseEvents auch den gewünschten

Modus einschalten oder ausschalten. Dieses geschieht mit folgender Anweisung :public void mouseEntered(MouseEvent e){

if (!selectMode) actualObject.mouseEntered(e);}

Page 14: UNDO & SELECT

DVG3 - Mh001 14

Bei der Methode muß man folgende Anweisungen hinzufügen. public void mouseClicked(MouseEvent e)

{if(selectMode){PaintableObjectf=graph.findAt(e.getX(),e.getY());System.out.println("found = "+f);}

else actualObject.mouseClicked(e); }

Im Selectmodus kann man die einzelnen Objekte nur unterscheiden durch ihre X,Y-Koordinaten.

Page 15: UNDO & SELECT

DVG3 - Mh001 15

Weiterhin muß in der Class PaintGraph folgende Methode mit eingefügt werden.

public PaintableObject findAt(int x, int y){PaintableObject le;for (int i=0;i<list.size();i++ ) {

le = (PaintableObject)(list.get(i));if ( le.contains(x,y) ) return le;} return null; }

Diese Methode durchsucht die Liste nach den Objekten mit den Koordinaten x,y die durch die Methode mouseClicked übergeben wurden.

Wenn dann Objekte gefunden wurden hat man die Möglichkeit an dieser Stelle den Befehl auszuweiten bzw. diese Objekte zu bearbeiten.

Page 16: UNDO & SELECT

DVG3 - Mh001 16

Nun kann man die einzelnen Objekte in unseren Zeichenpro-gramm suchen und genau zuweisen .

Dazu muß man die einzelnen Objekte z.B. PaintRect um definieren, da die Objekte in ein Graphic2D Objekt umgewandelt werden müssen.

z.B. in der Class PaintRect muß man die folgende Importanweisung hinzufügen.

import java.awt.geom.Rectangle2D; zusätzlich muß noch die Methode public boolean contains(int x,int y)

{ Rectangle2D.Double rec= new Rectangle2D.Double(Math.min(x0,x1),

Math.min(y0,y1),Math.abs(x0-x1),Math.abs(y0-y1)); return rec.contains(x,y);

}

Page 17: UNDO & SELECT

DVG3 - Mh001 17

Bei den einzelnen Objekten handelt es sich um SHAPE - Graphiken.

Was ist SHAPE ? Das Shape interface wurde definiert für die Darstellung einiger

geometrischer Objekte. Bei Shape Objekten wird unterschieden ob die Bildpunkte in

einem Objekt enthalten sind oder nicht. Dadurch können Shape Objekt genauer voneinander

unterschieden werden. Der Nachteil von Shape Objekten ist, daß die Objekte ausgefüllt

werden was für den Betrachter nicht zusehen ist. Dadurch können Objekte die über einander liegen nicht unterschieden werden, da als erstes Objekt das untere des gezeichneten Bildes angesprochen wird.