UNDO

Werbung
UNDO
&
SELECT
Vortrag : Martin Hiersche
21.12.1999
UNDO
DVG3 - Mh001
2
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.
DVG3 - Mh001
3
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.
DVG3 - Mh001
4
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.
DVG3 - Mh001
5
 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.
DVG3 - Mh001
6
 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;
DVG3 - Mh001
7
 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.
DVG3 - Mh001
8
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.
DVG3 - Mh001
9
SELECT
DVG3 - Mh001
10
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?
DVG3 - Mh001
11
Die Lösung
 Als erstes definiert man einen Knopf „select“ in Paint

GraphicButton selectButton =
new GraphicButton(Toolkit.getDefault
Toolkit().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')));
DVG3 - Mh001
12
 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);
}
DVG3 - Mh001
13
 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
unterscheiden durch ihre X,Y-Koordinaten.
DVG3 - Mh001
nur
14
 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.
DVG3 - Mh001
15
 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);
}
DVG3 - Mh001
16
 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.
DVG3 - Mh001
17
Zugehörige Unterlagen
Herunterladen