{"id":492,"date":"2018-11-15T14:03:38","date_gmt":"2018-11-15T13:03:38","guid":{"rendered":"https:\/\/freizone.net\/java-einfach-lernen\/?p=492"},"modified":"2020-05-11T19:29:40","modified_gmt":"2020-05-11T17:29:40","slug":"werkzeugspitzen-verfeinern","status":"publish","type":"post","link":"https:\/\/freizone.net\/java-einfach-lernen\/2018\/11\/15\/werkzeugspitzen-verfeinern\/","title":{"rendered":"Werkzeugspitzen verfeinern"},"content":{"rendered":"<p>Jetzt wollen wir einen JCheckBox hinzuf\u00fcgen die, wenn sie abgehakt ist, die Werkzeugspitzen gef\u00fcllt darstellt, und wenn nicht, eben ungef\u00fcllt.<\/p>\n<p>StartFenster.java<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-highlight=\"8,30,57,58\">package miniMalen1;\r\n\r\nimport java.awt.BorderLayout;\r\nimport java.awt.Color;\r\nimport java.awt.Dimension;\r\nimport java.util.ArrayList;\r\nimport javax.swing.ButtonGroup;\r\nimport javax.swing.JCheckBox;\r\nimport javax.swing.JFrame;\r\nimport javax.swing.JPanel;\r\nimport javax.swing.JRadioButton;\r\nimport javax.swing.JSpinner;\r\nimport javax.swing.JToggleButton;\r\nimport javax.swing.JToolBar;\r\nimport javax.swing.SpinnerNumberModel;\r\n\r\npublic class StartFenster extends JFrame {\r\n\r\n  public static void main(String[] s) {\r\n    new StartFenster();\r\n  }\r\n\r\n  private ArrayList&lt;Grafikobjekt&gt; virtuellerBildschirm = new ArrayList&lt;Grafikobjekt&gt;();\r\n  private JPanel panel;\r\n  private int x = -10;\r\n  private int y = -10;\r\n  JRadioButton kreisBtn;\r\n  JRadioButton quadratBtn;\r\n  JSpinner linienstaerke;\r\n  JCheckBox fuellen;\r\n  ButtonGroup werkzeugspitzen = new ButtonGroup();\r\n  private JToolBar auswahl;\r\n\r\n  public StartFenster() {\r\n    initialisiereStartFenster();\r\n  }\r\n\r\n  private void initialisiereStartFenster() {\r\n    this.setDefaultCloseOperation(EXIT_ON_CLOSE);\r\n    this.setBounds(0, 0, 500, 500);\r\n    this.setLocationRelativeTo(null);\r\n    this.setAlwaysOnTop(true);\r\n    this.setBackground(Color.white);\r\n    this.setTitle(\"Tafel\");\r\n    this.setLayout(new BorderLayout());\r\n\r\n    auswahl = new JToolBar();\r\n    auswahl.setPreferredSize(new Dimension(300, 30)); \/\/ PreferredSize = bevorzugte Gr\u00f6\u00dfe\r\n    auswahl.setFloatable(true);\r\n    \r\n    \r\n    kreisBtn = new JRadioButton(\"Kreis\");\r\n    quadratBtn = new JRadioButton(\"Quadrat\");\r\n    werkzeugspitzen.add(kreisBtn);\r\n    werkzeugspitzen.add(quadratBtn);\r\n    \r\n    fuellen = new JCheckBox(\"F\u00fcllen\");\r\n    auswahl.add(fuellen);\r\n    \r\n    auswahl.add(kreisBtn);\r\n    auswahl.add(quadratBtn);\r\n\r\n    SpinnerNumberModel nummern = new SpinnerNumberModel(10, 1, 99, 1); \/\/ ( default, Minimum, Maximum, Schrittweite\r\n                                      \/\/ )\r\n    linienstaerke = new JSpinner(nummern);\r\n    linienstaerke.setMinimumSize(new Dimension(50, 30)); \/\/ setzt die Mindestgr\u00f6\u00dfe ( Breite, H\u00f6he )\r\n    linienstaerke.setMaximumSize(new Dimension(50, 30)); \/\/ setzt die Maximalgr\u00f6\u00dfe\r\n\r\n    auswahl.add(linienstaerke);\r\n    this.add(auswahl, BorderLayout.PAGE_START);\r\n    \r\n    Tafel tafel = new Tafel(this);\r\n    this.add(tafel);\r\n\r\n    sichtbar();\r\n  }\r\n\r\n  private void sichtbar() {\r\n    this.setVisible(true);\r\n\r\n  }\r\n  \r\n  public int getLinienstaerke() {\r\n    int staerke = (int) this.linienstaerke.getValue();\r\n    return staerke;\r\n  }\r\n}\r\n<\/pre>\n<p>Zun\u00e4chst deklarieren wir daf\u00fcr eine JCheckBox im Variablenfeld von StartFenster (Zeile 30).<br \/>\nDann initialisieren wir die Checkbox in unserer Initialisierungsmethode (Zeile 57 und 58) und f\u00fcgen sie der auswahl hinzu.<\/p>\n<p>Grafikobjekt.java<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-highlight=\"12,14,18,37-39\">package miniMalen1;\r\n\r\nimport java.awt.Point;\r\n\r\nimport javax.swing.JCheckBox;\r\n\r\nclass Grafikobjekt {\r\n\r\n  Point koordinaten;\r\n  int stiftdicke;\r\n  int stifttyp;\r\n  boolean gefuellt;\r\n\r\n  public Grafikobjekt(Point p, int sd, int st, boolean gf) {\r\n    this.koordinaten = p;\r\n    this.stiftdicke = sd;\r\n    this.stifttyp = st;\r\n    this.gefuellt = gf;\r\n  }\r\n\r\n  public Point getKoordinaten() {\r\n    return this.koordinaten;\r\n  }\r\n\r\n  public void setKoordinaten(Point koordinaten) {\r\n    this.koordinaten = koordinaten;\r\n  }\r\n\r\n  public int getStiftdicke() {\r\n    return this.stiftdicke;\r\n  }\r\n  \r\n  public int getStifttyp() {\r\n    return stifttyp;\r\n  }\r\n\r\n  public boolean isGefuellt() {\r\n    return this.gefuellt;\r\n  }\r\n}<\/pre>\n<p>Im Grafikobjekt f\u00fcgen wir eine boolean Variable <em>gefuellt<\/em> hinzu und erg\u00e4nzen den Konstruktor. Ausserdem f\u00fcgen wir einen entsprechenden getter hinzu.<\/p>\n<p>Tafel.java<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-highlight=\"38-43,56\">package miniMalen1;\r\n\r\nimport java.awt.Color;\r\nimport java.awt.Graphics;\r\nimport java.awt.Point;\r\nimport java.awt.event.MouseEvent;\r\nimport java.awt.event.MouseListener;\r\nimport java.awt.event.MouseMotionListener;\r\nimport java.util.ArrayList;\r\nimport javax.swing.JPanel;\r\n\r\npublic class Tafel extends JPanel implements MouseListener, MouseMotionListener {\r\n\r\n  private ArrayList&lt;Grafikobjekt&gt; virtuellerBildschirm = new ArrayList&lt;Grafikobjekt&gt;();\r\n\r\n  private int x = -10;\r\n  private int y = -10;\r\n  private StartFenster auswahl;\r\n\r\n  public Tafel(StartFenster auswahl) {\r\n    this.auswahl = auswahl;\r\n    this.setBackground(Color.WHITE);\r\n    this.addMouseListener(this);\r\n    this.addMouseMotionListener(this);\r\n  }\r\n\r\n  public void paintComponent(Graphics g) {\r\n    super.paintComponent(g);\r\n\r\n    {\r\n      for (int z = 0; z &lt; virtuellerBildschirm.size(); z++) {\r\n        Grafikobjekt go = virtuellerBildschirm.get(z);\r\n        if(go.isGefuellt()) {\r\n          if(go.stifttyp == 2)\r\n          g.fillRect(go.getKoordinaten().x, go.getKoordinaten().y, go.getStiftdicke(), go.getStiftdicke());\r\n          else\r\n          g.fillOval(go.getKoordinaten().x, go.getKoordinaten().y, go.getStiftdicke(), go.getStiftdicke());\r\n        } else {\r\n          if(go.stifttyp == 2)\r\n          g.drawRect(go.getKoordinaten().x, go.getKoordinaten().y, go.getStiftdicke(), go.getStiftdicke());\r\n          else\r\n          g.drawOval(go.getKoordinaten().x, go.getKoordinaten().y, go.getStiftdicke(), go.getStiftdicke());\r\n        }\r\n      }\r\n    }\r\n\r\n  }\r\n  \r\n  public void zeichneAufVirtuellenBildschirm(int x, int y) {\r\n    int werkzeug;\r\n    if ( auswahl.quadratBtn.isSelected() ) {\r\n      werkzeug = 2;\r\n    } else {\r\n      werkzeug = 1;\r\n    }\r\n    virtuellerBildschirm.add(new Grafikobjekt(new Point(x, y), auswahl.getLinienstaerke(), werkzeug, auswahl.fuellen.isSelected() ));\r\n    System.out.println(auswahl.fuellen.isSelected());\r\n    this.repaint();\r\n  }\r\n\r\n  @Override\r\n  public void mouseDragged(MouseEvent e) {\r\n    System.out.println(\"Dragged\");\r\n    x = e.getX();\r\n    y = e.getY();\r\n    zeichneAufVirtuellenBildschirm(x,y);\r\n  }\r\n\r\n  @Override\r\n  public void mousePressed(MouseEvent e) {\r\n    System.out.println(\"Pressed\");\r\n    x = e.getX();\r\n    y = e.getY();\r\n    zeichneAufVirtuellenBildschirm(x,y);\r\n  }\r\n}\r\n<\/pre>\n<p>Hier \u00fcbergeben wir dem virtuellen Bildschirm unser neues Grafikobjekt in dessen Konstruktoraufruf wir am Ende unseren JSpinner mit isSelected abfragen und dem entsprechend ein true oder false erhalten das weitergegeben wird (Zeile 56).<br \/>\nAbschlie\u00dfend m\u00fcssen wir nur noch in der paint-Methode unsere if-Abfrage in eine weitere einbetten sowie einen else-Zweig hinzuf\u00fcgen der im Falle eines ungef\u00fcllten Grafikobjekts greift (Zeile 38 &#8211; 43).<\/p>\n<p>Nun ist es so, das in der paint oder paintComponent-Methode m\u00f6glichst wenig Logik sein sollte. Also idealerweise nur direkte Darstellungen von Grafikobjekten. Da wir mittlerweile schon einige if-Abfragen direkt in der paint-Methode sitzen haben, m\u00fcssen wir damit rechnen das dies fr\u00fcher oder sp\u00e4ter auf die Performance geht. Und das ist nicht akzeptabel. Schlie\u00dflich wollen wir nach jedem Klick nicht eine Sekunde warten bis der Punkt erscheint. Nat\u00fcrlich passiert das nicht so schnell bis dieser Fall eintritt, aber es ist dennoch guter Programmierstil die Logik auszulagern bzw. das Programm an dieser Stelle zu optimieren.<br \/>\nDiese Optimierungen und die sich daraus ergebenden neuen M\u00f6glichkeiten wollen wir im n\u00e4chsten Kapitel behandeln.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jetzt wollen wir einen JCheckBox hinzuf\u00fcgen die, wenn sie abgehakt ist, die Werkzeugspitzen gef\u00fcllt darstellt, und wenn nicht, eben ungef\u00fcllt. StartFenster.java package miniMalen1; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.util.ArrayList; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JSpinner; import javax.swing.JToggleButton; import javax.swing.JToolBar; import javax.swing.SpinnerNumberModel; public class StartFenster extends JFrame { [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/492"}],"collection":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/comments?post=492"}],"version-history":[{"count":7,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/492\/revisions"}],"predecessor-version":[{"id":839,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/492\/revisions\/839"}],"wp:attachment":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/media?parent=492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/categories?post=492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/tags?post=492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}