DVG3 - Paint Teil 2 1
Paint Teil2
DV
G3 - P
aint Teil 2
2
Weitere EntwicklungenHinzufügen verschiedener Werkzeuge:
PunkteLinienRechtecke, Rechtecke mit runden Ecken, 3D-RechteckeOvalePolygonzügeText einfügen
Hinzufügen von Optionen:FüllmodusPolygonzug schließenFarbauswahlLinienarten
Hinzufügen von HilfsmittelnHilfstexte anzeigenProtokoll schreibenKorrekturmöglichkeitenSpeichern auf Dateien
DV
G3 - P
aint Teil 2
3
Werkzeuge: draw und pointUm verschiedene Werkzeuge verfügbar zu machen, ist es günstig Buttons für jedes Werkzeug zu definieren.
ActionListener muß auf verschiedene Aktionen reagieren.
MouseListener und MouseMotionListener müssen in Abhängigkeit des gewählten Werkzeuges verschieden reagieren.
Es sollte angezeigt welches Tool ausgewählt wurde.
Es sollten Hinweise angezeigt werden, wie das ausgewählte Tool zu benutzen ist.
DV
G3 - P
aint Teil 2
4
Tools-Leiste, Tools-MenüWelches Werkzeug wird benutzt?
Konstanten für jedes Wekzeug eine int-Konstanteprivate static final int DRAW_PRESSED = 0;private static final int POINT_PRESSED = 1;
Feld mit Namen aller Werkzeugeprivate static final String [] toolName = {"draw","point"};
Globale Variableprivate int toolStatus = DRAW_PRESSED;
Label zur Anzeige welches Werkzeug ausgewählt wurdeprivate Label toolLabel = new Label(" tool : "+toolName[toolStatus]);
Programm zur Erzeugung der Buttons und Menüeinträger:createTools(MenuBar menu)
DV
G3 - P
aint Teil 2
5
private void createTools(MenuBar menu){Menu toolsMenu = new Menu("Tools");menu.add(toolsMenu);toolsMenu.addActionListener(this);toolsMenu.add(new MenuItem("draw", new MenuShortcut('d')));toolsMenu.add(new MenuItem("point", new MenuShortcut('p')));
Panel toolsPanel = new Panel();toolsPanel.setBackground(new Color(240,240,240));toolsPanel.setLayout(new GridBagLayout());GridBagConstraints gbc = new GridBagConstraints();gbc.gridwidth = GridBagConstraints.REMAINDER; Button drawButton = new Button("draw");drawButton.addActionListener(this);toolsPanel.add(drawButton,gbc);Button pointButton = new Button("point");pointButton.addActionListener(this);toolsPanel.add(pointButton,gbc);gbc.weighty=1.0;toolsPanel.add(new Label(),gbc);add(toolsPanel,BorderLayout.WEST);}
DV
G3 - P
aint Teil 2
6
Erweiterung des ActionListenersAlte Version:public void actionPerformed(ActionEvent e){
dispose();}
Reagiert nur korrekt auf "exit"
Es muss unterschieden werden, welcher Knopf gedrückt wurde.
DV
G3 - P
aint Teil 2
7
public void actionPerformed(ActionEvent e)
{
char command = e.getActionCommand().charAt(0);
switch (command)
{
case 'e':
dispose();
case 'd':
toolStatus=DRAW_PRESSED;
break;
case 'p':
toolStatus=POINT_PRESSED;
break;
}
toolLabel.setText(" tool : "+toolName[toolStatus]);
}
DV
G3 - P
aint Teil 2
8
Realisierung der Werkzeugepoint:
Wenn Maustaste gedrückt wird (mousePressed), muss ein Punkt gezeichnet werden.
draw:
Wenn Maustaste gedrückt wird (mousePressed), muss die Position gemerkt werden.
Wenn Maus mit gedrückter Taste bewegt wird (mouseDragged), muss eine Linie vom vorherigen Punkt zum aktuellen Punkt gezeichnet werden und der aktuelle Punkt gespeichert werden.
DV
G3 - P
aint Teil 2
9
public void mousePressed(MouseEvent e){
x0 = e.getX();y0 = e.getY();switch (toolStatus){case POINT_PRESSED:
gPanel.getGraphics().fillOval(x0-1,y0-1,3,3);break;
}}public void mouseDragged(MouseEvent e){
int x = e.getX();int y = e.getY();switch (toolStatus){case DRAW_PRESSED:
gPanel.getGraphics().drawLine(x0,y0,x,y);break;
}x0=x;y0=y;showStatus(x, y);
}
DV
G3 - P
aint Teil 2
10
Werkzeuge: line, rectErweiterungen:
Konstantenprivate static final int LINE_PRESSED = 2;private static final int RECT_PRESSED = 3;private static final String [] toolName = {"draw","point","line","rect"};
Menü und Buttons in createMenu(MenuBar menu)toolsMenu.add(new MenuItem("line",
new MenuShortcut('l')));toolsMenu.add(new MenuItem("rect",
new MenuShortcut('r')));Button lineButton = new Button("line");lineButton.addActionListener(this);toolsPanel.add(lineButton,gbc);Button rectButton = new Button("rect");rectButton.addActionListener(this);toolsPanel.add(rectButton,gbc);
DV
G3 - P
aint Teil 2
11
ActionListenercase 'l': toolStatus=LINE_PRESSED; lineDraw=0; break;case 'r': toolStatus=RECT_PRESSED; rectDraw=0; break;
Problem:Zum Zeichnen einer Linie bzw. eines Rechteckes benötigt man zwei Punkte. mousePressed muss wissen, ob der erste Punkt eingegeben wurde oder der Zweite globale Statusvariable:private int lineDraw = 0;private int rectDraw = 0;0 erster Punkt wird erwartet1 zweiter Punkt wird erwartet
DV
G3 - P
aint Teil 2
12
public void mousePressed(MouseEvent e){
int x = e.getX();int y = e.getY();switch (toolStatus){case POINT_PRESSED:
gPanel.getGraphics().fillOval(x-1,y-1,3,3);break;
case LINE_PRESSED :if (lineDraw==1)gPanel.getGraphics().drawLine(x0,y0,x,y);lineDraw = 1-lineDraw;break;
case RECT_PRESSED :if (rectDraw==1)gPanel.getGraphics().drawRect(Math.min(x,x0),Math.min(y,y0),Math.abs(x-x0),Math.abs(y-y0));rectDraw = 1-rectDraw;break;
}x0=x;y0=y;
}
DV
G3 - P
aint Teil 2
13
Hilfstexte anzeigenProblem: Nach kurzer Zeit verliert man den Überblick worauf das Programm nun wartet. Erster Punkt der Linie oder zweiter? ...
Lösung: Anzeige von Hilfetexten.
TextField am unteren Rand für Hilfstexte
Erweiterungen:
Globale Variableprivate static final String [] [] messages = {{"Kurve mit gedreuckter Maustaste zeichnen!"},{"Punkt setzen!"},{"Anfangspunkt eingeben!","Endpunkt eingeben!"},{"Erste Ecke eingeben!", "Gegenueberliegende Ecke eingeben!"}};private TextField messageField = new TextField(messages[toolStatus][0]);
DV
G3 - P
aint Teil 2
14
Hilfstextanzeige einrichten mit createMessage()private void createMessage(){messageField.setEditable(false);messageField.setBackground(new Color(240,240,240));add(messageField,BorderLayout.SOUTH);}Anzeige der Hilfstexte
In mousePressedcase LINE_PRESSED :if (lineDraw==1)gPanel.getGraphics().drawLine(x0,y0,x,y);lineDraw = 1-lineDraw;messageField.setText(messages[LINE_PRESSED][lineDraw]);break;
case RECT_PRESSED :if (rectDraw==1)gPanel.getGraphics().drawRect(Math.min(x,x0),Math.min(y,y0),Math.abs(x-x0),Math.abs(y-y0));rectDraw = 1-rectDraw;messageField.setText(messages[RECT_PRESSED][rectDraw]);break;
DV
G3 - P
aint Teil 2
15
In actionPerformed...messageField.setText(messages[toolStatus][0]);
DV
G3 - P
aint Teil 2
16
FüllmodusRechtecke können ausgefüllt werden oder leer gezeichnet werden. Checkbox
Checkbox beeinflusst den Status Anordnung in dem rechten Statusbereich
Im Menü erfüllt CheckboxMenuItem die gleiche Funktion
Checkbox und CheckboxMenuItem erzeugen ItemEvents
DV
G3 - P
aint Teil 2
17
Checkbox, CheckboxMenuItemKonstruktoren
Checkbox()
Checkbox(String label)
Checkbox(String label, boolean state)
CheckboxMenuItem()
CheckboxMenuItem(String label)
CheckboxMenuItem(String label, boolean state)
Methoden
public void addItemListener(ItemListener l) public void removeItemListener(ItemListener l)
public boolean getState()public void setState(boolean state)
public String getLabel()public void setLabel(String label)
DV
G3 - P
aint Teil 2
18
ItemListener, ItemAdapterMethodepublic void itemStateChanged(ItemEvent e)wird aufgerufen, wenn der Status der Checkbox bzw. des CheckboxMenuItem geändert wurde.
DV
G3 - P
aint Teil 2
19
ItemEventMethoden
public ItemSelectable getItemSelectable()liefert das Object, dessen Status geändert wurde
public int getStateChanged()liefert den Zustand des geänderten ObjektesSELECTED oder DESELECTED
DV
G3 - P
aint Teil 2
20
Globale Variableprivate boolean fillMode = false;private Checkbox fillCB =
new Checkbox("fill",fillMode);private CheckboxMenuItem fillCBMI =
new CheckboxMenuItem("fill",fillMode);Options-Menü in createStatus(MenuBar menu)Menu optionsMenu = new Menu("Options");menu.add(optionsMenu);optionsMenu.add(fillCBMI);fillCBMI.addItemListener(this);...statusPanel.add(fillCB,gbc);fillCB.addItemListener(this);ItemListenerpublic void itemStateChanged(ItemEvent e){
fillMode=!fillMode;fillCB.setState(fillMode);
fillCBMI.setState(fillMode);}
DV
G3 - P
aint Teil 2
21
Fill-Mode realisierenPublic void mousePressed(MouseEvent e)
{
...case RECT_PRESSED :if (rectDraw==1)if (fillMode)gPanel.getGraphics().fillRect(Math.min(x,x0),Math.min(y,y0),Math.abs(x-x0),Math.abs(y-y0));else gPanel.getGraphics().drawRect(Math.min(x,x0),Math.min(y,y0),Math.abs(x-x0),Math.abs(y-y0));rectDraw = 1-rectDraw;messageField.setText(messages[RECT_PRESSED][rectDraw]);break;...
DV
G3 - P
aint Teil 2
22
Protokoll schreibenProtokoll ermöglicht es, eine paint-Methode zu entwickeln, die das gleiche Bild erzeugt, wie gezeichnet wurde.
Globale Variable
private boolean protMode = false;
private Checkbox protCB = new Checkbox("Protokoll",protMode);
private CheckboxMenuItem protCBMI = new CheckboxMenuItem("Protokoll",protMode);
private Frame protFrame = new Frame("Protokoll");
private TextArea protTA = new TextArea();
File-Menü und Checkbox in createFile(MenuBar menu)
fileMenu.add(protCBMI);
protCBMI.addItemListener(this);
filePanel.add(protCB);
protCB.addItemListener(this);
DV
G3 - P
aint Teil 2
23
ItemListenerpublic void itemStateChanged(ItemEvent e){
ItemSelectable s = e.getItemSelectable();if ( (s==fillCB) || (s==fillCBMI) ){
fillMode=!fillMode;fillCB.setState(fillMode);fillCBMI.setState(fillMode);return;
}if ( (s==protCB) || (s==protCBMI) ){
protMode=!protMode;protCB.setState(protMode);protCBMI.setState(protMode);protFrame.setVisible(protMode);return;
}
}
DV
G3 - P
aint Teil 2
24
Protokoll schreibenprivate void writeProt(String text) {
protTA.append(text+"\n");}public void mousePressed(MouseEvent e){...case POINT_PRESSED: gPanel.getGraphics().fillOval(x-1,y-1,3,3); writeProt("g.fillOval("+(x-1)+","+(y-1)+",3,3);"); break;....