240 likes | 325 Views
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
E N D
Paint Teil2 DVG3 - Paint Teil 2
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 • Hilfstexte anzeigen • Protokoll schreiben • Korrekturmöglichkeiten • Speichern auf Dateien DVG3 - Paint Teil 2
Werkzeuge: draw und point • Um 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. DVG3 - Paint Teil 2
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) DVG3 - Paint Teil 2
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); } DVG3 - Paint Teil 2
Erweiterung des ActionListeners • Alte Version:public void actionPerformed(ActionEvent e){ dispose();} • Reagiert nur korrekt auf "exit" • Es muss unterschieden werden, welcher Knopf gedrückt wurde. DVG3 - Paint Teil 2
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]); } DVG3 - Paint Teil 2
Realisierung der Werkzeuge • point: • 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. DVG3 - Paint Teil 2
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); } DVG3 - Paint Teil 2
Werkzeuge: line, rect • Erweiterungen: • 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); DVG3 - Paint Teil 2
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 DVG3 - Paint Teil 2
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; } DVG3 - Paint Teil 2
Hilfstexte anzeigen • Problem: 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]); DVG3 - Paint Teil 2
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; DVG3 - Paint Teil 2
In actionPerformed...messageField.setText(messages[toolStatus][0]); DVG3 - Paint Teil 2
Füllmodus • Rechtecke 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 DVG3 - Paint Teil 2
Checkbox, CheckboxMenuItem • Konstruktoren • 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) DVG3 - Paint Teil 2
ItemListener, ItemAdapter • Methodepublic void itemStateChanged(ItemEvent e)wird aufgerufen, wenn der Status der Checkbox bzw. des CheckboxMenuItem geändert wurde. DVG3 - Paint Teil 2
ItemEvent • Methoden • public ItemSelectable getItemSelectable()liefert das Object, dessen Status geändert wurde • public int getStateChanged()liefert den Zustand des geänderten ObjektesSELECTED oder DESELECTED DVG3 - Paint Teil 2
Globale Variable • private 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);} DVG3 - Paint Teil 2
Fill-Mode realisieren Public 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;... DVG3 - Paint Teil 2
Protokoll schreiben • Protokoll 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); DVG3 - Paint Teil 2
ItemListener public 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; } } DVG3 - Paint Teil 2
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;.... DVG3 - Paint Teil 2