{"id":479,"date":"2018-11-15T14:03:23","date_gmt":"2018-11-15T13:03:23","guid":{"rendered":"https:\/\/freizone.net\/java-einfach-lernen\/?p=479"},"modified":"2020-05-11T19:29:40","modified_gmt":"2020-05-11T17:29:40","slug":"programm-weiter-strukturieren","status":"publish","type":"post","link":"https:\/\/freizone.net\/java-einfach-lernen\/2018\/11\/15\/programm-weiter-strukturieren\/","title":{"rendered":"Programm weiter strukturieren"},"content":{"rendered":"<p>Zuerst lagern wir die Klasse Grafikobjekt in eine neue Datei aus.<br \/>\nDann erzeugen wir in unserem Paket eine neue Klasse mit Namen StartFenster.java<br \/>\nund kopieren folgenden Quellcode hinein:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">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.JFrame;\r\nimport javax.swing.JPanel;\r\nimport javax.swing.JSpinner;\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  JSpinner linienstaerke;\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    this.add(auswahl, BorderLayout.PAGE_START);\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    \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\r\n}\r\n<\/pre>\n<p>Wie wir Zeile 23 entnehmen k\u00f6nnen darf der JSpinner nicht mehr privat sein, da wir ja von einer anderen Klasse aus darauf zugreifen m\u00fcssen.<\/p>\n<p>Es ist eine Methode getLinienstaerke hinzugekommen. In den Mauslistener MousePressed und MouseDragged m\u00fcssen wir den Statuswert des Spinners auslesen. Da nun der Spinner in einem anderen Objekt liegt, w\u00fcrde die Zeile nochmals l\u00e4nger werden. Dadurch, das wir in der Methode getLinienstaerke bereits das Objekt das von getValue zur\u00fcckgegeben wird, in ein int umwandeln, bleibt die aufrufende Zeile in den Mouselistener k\u00fcrzer und damit \u00fcbersichtlicher.<\/p>\n<p>In Zeile 52 erstellen wir ein Objekt vom Typ Tafel. Damit die Tafel sp\u00e4ter auf die Variablen des StartFensters zugreifen kann, k\u00f6nnen wir die Referenz unseres StartFensters mit this \u00fcbergeben, da wir uns ja in jenem befinden.<\/p>\n<p>Kommen wir nun zur Datei Tafel.java:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">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        g.fillOval(go.getKoordinaten().x, go.getKoordinaten().y, go.getStiftdicke(), go.getStiftdicke());\r\n      }\r\n    }\r\n\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\r\n    virtuellerBildschirm.add(new Grafikobjekt(new Point(x, y), auswahl.getLinienstaerke()));\r\n\r\n    this.repaint();\r\n  }\r\n\r\n  @Override\r\n  public void mouseMoved(MouseEvent e) {\r\n    \/\/ TODO Automatisch generierter Methodenstub\r\n\r\n  }\r\n\r\n  @Override\r\n  public void mouseClicked(MouseEvent e) {\r\n    \/\/ TODO Automatisch generierter Methodenstub\r\n\r\n  }\r\n\r\n  @Override\r\n  public void mouseEntered(MouseEvent e) {\r\n    \/\/ TODO Automatisch generierter Methodenstub\r\n\r\n  }\r\n\r\n  @Override\r\n  public void mouseExited(MouseEvent e) {\r\n    \/\/ TODO Automatisch generierter Methodenstub\r\n\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\r\n    virtuellerBildschirm.add(new Grafikobjekt(new Point(x, y), auswahl.getLinienstaerke()));\r\n\r\n    this.repaint();\r\n  }\r\n\r\n  @Override\r\n  public void mouseReleased(MouseEvent e) {\r\n    \/\/ TODO Automatisch generierter Methodenstub\r\n\r\n  }\r\n\r\n}\r\n<\/pre>\n<p>Neu ist in Zeile 12, die beiden MouseListener die nun gleich in die Klasse implementiert wird.<br \/>\nDa wir die Klasse aufgrund der Trennung zum Startfenster nun gleich mit extends JPanel zu einem JPanel machen k\u00f6nnen, ist dies m\u00f6glich und vereinfacht den Quelltext. Die Methoden f\u00fcr unsere Mauslistener k\u00f6nnen wir von Eclipse automatisch hinzuf\u00fcgen lassen, indem wir die Maus \u00fcber den meist gelb oder rot unterstrichenen Klassennamen f\u00fchren und dann das Angebot von Eclipse annehmen die ben\u00f6tigten Methoden einzuf\u00fcgen.<\/p>\n<p>Weiter brauchen wir in Zeile 18 eine Variable StartFenster da wir im Konstruktor ja jenes StartFenster erwarten das wir in Zeile 52 von StartFenster.java \u00fcbergeben haben.<br \/>\nNachdem wir unsere Variable damit bef\u00fcllt haben (Zeile 21) f\u00fcgen wir dem JPanel noch die beiden MouseListener hinzu (implement allein reicht nicht, man muss explizit angeben welche Objekte welchen Mouselistener erhalten sollen).<\/p>\n<p>Auch die bisherige initialisiere.. Methode f\u00e4llt weg, da wir Buttons und Spinner ja ausgelagert haben.<\/p>\n<p>Schlie\u00dflich finden wir in Zeile 45 und 80 die Zeile in der wir unserem virtuellem Bildschirm ein Grafikobjekt hinzuf\u00fcgen. Hier m\u00fcssten wir, falls wir im StartFenster keine Methode getLinienstaerke definiert h\u00e4tten<br \/>\n<code>(int) auswahl.linienstaerke.getValue()<\/code> statt\u00a0<code>auswahl.getLinienstaerke()<\/code><br \/>\nschreiben, was den Quellcode wesentlich un\u00fcbersichtlicher machen w\u00fcrde.<\/p>\n<p>Zuallerletzt fallen noch einige Importe weg, die \u00fcberfl\u00fcssig geworden sind, da sie bereits im StartFenster importiert wurden.<\/p>\n<p>Im n\u00e4chsten Kapitel wollen wir folgende Funktion implementieren:<br \/>\nZwei verschiedene Werkzeugspitzen, Kreis und Quadrat.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zuerst lagern wir die Klasse Grafikobjekt in eine neue Datei aus. Dann erzeugen wir in unserem Paket eine neue Klasse mit Namen StartFenster.java und kopieren folgenden Quellcode hinein: package miniMalen1; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JToolBar; import javax.swing.SpinnerNumberModel; public class StartFenster extends JFrame { public [&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\/479"}],"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=479"}],"version-history":[{"count":6,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/479\/revisions"}],"predecessor-version":[{"id":837,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/479\/revisions\/837"}],"wp:attachment":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/media?parent=479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/categories?post=479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/tags?post=479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}