paint teil2

24
DVG3 - Paint Teil 2 1 Paint Teil2

Upload: casey-guy

Post on 02-Jan-2016

38 views

Category:

Documents


0 download

DESCRIPTION

Paint Teil2. Weitere Entwicklungen. Hinzufügen verschiedener Werkzeuge: Punkte Linien Rechtecke, Rechtecke mit runden Ecken, 3D-Rechtecke Ovale Polygonzüge Text einfügen Hinzufügen von Optionen: Füllmodus Polygonzug schließen Farbauswahl Linienarten Hinzufügen von Hilfsmitteln - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Paint Teil2

DVG3 - Paint Teil 2 1

Paint Teil2

Page 2: 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

Page 3: Paint Teil2

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.

Page 4: Paint Teil2

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)

Page 5: Paint Teil2

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);}

Page 6: Paint Teil2

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.

Page 7: Paint Teil2

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]);

}

Page 8: Paint Teil2

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.

Page 9: Paint Teil2

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);

}

Page 10: Paint Teil2

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);

Page 11: Paint Teil2

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

Page 12: Paint Teil2

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;

}

Page 13: Paint Teil2

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]);

Page 14: Paint Teil2

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;

Page 15: Paint Teil2

DV

G3 - P

aint Teil 2

15

In actionPerformed...messageField.setText(messages[toolStatus][0]);

Page 16: Paint Teil2

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

Page 17: Paint Teil2

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)

Page 18: Paint Teil2

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.

Page 19: Paint Teil2

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

Page 20: Paint Teil2

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);}

Page 21: Paint Teil2

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;...

Page 22: Paint Teil2

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);

Page 23: Paint Teil2

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;

}

}

Page 24: Paint Teil2

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;....