{"id":336,"date":"2018-10-29T11:40:55","date_gmt":"2018-10-29T10:40:55","guid":{"rendered":"https:\/\/freizone.net\/java-einfach-lernen\/?p=336"},"modified":"2020-05-11T19:29:40","modified_gmt":"2020-05-11T17:29:40","slug":"mini-malprogramm","status":"publish","type":"post","link":"https:\/\/freizone.net\/java-einfach-lernen\/2018\/10\/29\/mini-malprogramm\/","title":{"rendered":"Mini-Malprogramm"},"content":{"rendered":"\r\n\r\nJetzt werden wir auch schon das erste kleine Malprogramm schreiben: Wir legen ein neues Package an und erstellen darin eine Klasse mit Namen StartFenster:\r\n\r\n\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">package miniMalen;\r\n\r\nimport java.awt.Color;\r\nimport java.awt.Graphics;\r\nimport java.awt.Graphics2D;\r\nimport java.awt.Point;\r\nimport java.awt.Polygon;\r\nimport java.awt.Shape;\r\nimport java.awt.event.MouseAdapter;\r\nimport java.awt.event.MouseEvent;\r\nimport java.awt.event.MouseListener;\r\nimport java.awt.geom.Arc2D;\r\n\r\nimport javax.swing.JFrame;\r\nimport javax.swing.JPanel;\r\nimport javax.swing.JLabel;\r\n\r\npublic class StartFenster extends JFrame {\r\n\r\n  static int x = -10;\r\n  static int y = -10;\r\n\r\n  public static void main(String[] args) {\r\n    \r\n    StartFenster = new Fenster();\r\n\r\n    fenster.setDefaultCloseOperation( EXIT_ON_CLOSE );\r\n    fenster.setBounds( 0, 0, 900, 500 );\r\n    fenster.setLocationRelativeTo( null );\r\n    fenster.setAlwaysOnTop( true );\r\n    fenster.setVisible( true );  \r\n        \r\n    JPanel panel = new JPanel() {\r\n\r\n     public void paint( Graphics g ) {\r\n     \t\t\t\t\t\t \t\t\r\n       g.fillOval(x, y, 10, 10);\t    \t\r\n          \t  \r\n     }\r\n    \r\n    };\r\n  \r\n    panel.setBackground( new Color( 255, 255, 255 ) );\r\n    JLabel label = new JLabel (\"HalloWelt!\", JLabel.CENTER);\r\n    panel.add(label);\r\n    fenster.add(panel);\r\n             \r\n    panel.addMouseMotionListener(new MouseAdapter() {\r\n        public void mouseDragged(MouseEvent arg0) {\r\n           System.out.println(\"Dragged\");\r\n               x = arg0.getX();\r\n             y = arg0.getY();\r\n             panel.repaint();\r\n                  \t\r\n        }\r\n    });\r\n    \r\n    panel.addMouseListener(new MouseAdapter() {\r\n        public void mousePressed(MouseEvent arg0) { \r\n         System.out.println(\"Test\");\r\n             x = arg0.getX();\r\n             y = arg0.getY();\r\n             panel.repaint();\r\n        }\t\r\n    });\r\n            \r\n  } \r\n}\r\n<\/pre>\r\n\r\n\r\nDas besondere an diesem Beispiel ist, das es nur dann richtig funktioniert, wenn x und y als statische Variablen deklariert wurden und damit sofort verf\u00fcgbar sind. Das ist deswegen so, weil wir uns in der Main-Methode befinden und diese statisch ist. Klassenvariable stehen normal nur zur Verf\u00fcgung nachdem ein Objekt der Klasse gebildet wurde. Da wir aber aufgrund der K\u00fcrze des Programms darauf verzichten machen wir die Variablen einfach ebenfalls statisch. Dies ist wohlgemerkt nur bei kleinen Beispielen sinnvoll. Bei gr\u00f6\u00dferen Programmen sollte <code>static<\/code> nur gut \u00fcberlegt eingesetzt werden.\r\n\r\nSo w\u00fcrde das Programm ohne statische Variablen aussehen:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">package start;\r\n\r\nimport java.awt.Color;\r\nimport java.awt.Graphics;\r\nimport java.awt.event.MouseAdapter;\r\nimport java.awt.event.MouseEvent;\r\nimport javax.swing.JFrame;\r\nimport javax.swing.JPanel;\r\nimport javax.swing.JLabel;\r\n\r\npublic class MiniMalprogramm2 extends JFrame {\r\n\r\n  int x = -10;\r\n  int y = -10;\r\n\r\n  public static void main(String[] args) {\t\t\r\n    new MiniMalprogramm2();\t\t\t      \r\n  } \r\n  \r\n  \r\n  public MiniMalprogramm2() {\r\n    initialisiereObjekte();\r\n    zeige();\r\n  }\r\n  \r\n  private void zeige() {\r\n    this.setVisible( true ); \t\t\r\n  }\r\n\r\n\r\n  public void initialisiereObjekte() {\r\n    this.setDefaultCloseOperation( EXIT_ON_CLOSE );\r\n    this.setBounds( 0, 0, 900, 500 );\r\n    this.setLocationRelativeTo( null );\r\n    this.setAlwaysOnTop( true );\r\n    this.getContentPane().setBackground(Color.white);\r\n    this.setBackground(Color.white);\r\n\r\n    \r\n            \r\n    JPanel panel = new JPanel() {\r\n     public void paint( Graphics g ) {\t\r\n      \/\/ super.paint(g);\r\n       g.fillOval(x, y, 10, 10);\t    \t\t\t    \t  \r\n     }\r\n    \r\n    };\r\n  \r\n    panel.setBackground( Color.WHITE );\r\n    panel.setBounds(0, 0, 100, 100);\r\n\r\n    \r\n    this.add(panel);\r\n             \r\n    panel.addMouseMotionListener(new MouseAdapter() {\r\n        public void mouseDragged(MouseEvent arg0) {\r\n           System.out.println(\"Dragged\");\r\n               x = arg0.getX();\r\n             y = arg0.getY();\r\n             panel.repaint();\r\n                  \t\r\n        }\r\n    });\r\n    \r\n    panel.addMouseListener(new MouseAdapter() {\r\n        public void mousePressed(MouseEvent arg0) { \r\n         System.out.println(\"Test\");\r\n             x = arg0.getX();\r\n             y = arg0.getY();\r\n             panel.repaint();\r\n        }\t\r\n    });\r\n  }\r\n}\r\n<\/pre>\r\nDas <code>this<\/code>\u00a0in den Zeilen 32 &#8211; 34 ist nur der Vollst\u00e4ndigkeit halber dort. Man k\u00f6nnte auch alle Befehle die den JFrame betreffen und ihn einstellen auch ohne <code>this.<\/code> schreiben. Dann m\u00fcssten wir allerdings alle Befehle mit der Hand eingeben. Schreiben wir jedoch <code>this.<\/code> stellt uns Eclipse sofort in einer Auswahl alle Methoden zur Verf\u00fcgung die das Objekt betreffen auf welches sich <code>this<\/code> bezieht, und das ist unsere Klasse, die ja auch ein JFrame ist, da wir sie mit <code>extends<\/code> dementsprechend erweitert haben.\r\n\r\nHier sehen wir das die main-Methode im Konstruktor der Klasse zuerst die Methode\u00a0 <code>initialisiereObjekte()<\/code> aufruft und danach die zeige-Methode die nur setVisible aufruft. Theoretisch kann man das\u00a0<code>this.setVisible( true );<\/code> auch in die initialisiereObjekte-Methode schreiben. Es ist aber vern\u00fcnftig dies in eine eigene Methode zu schreiben da hierdurch gesichert ist das setVisible erst am Ende aufgerufen wird. Ansonsten kann es nach dem Kompilieren gerade bei gr\u00f6\u00dferen Programmen vorkommen das manche Komponenten und gewissen Umst\u00e4nden, z.B. vergr\u00f6\u00dfern des Fensters nicht sichtbar sind &#8211; kurz gesagt, es zu grafischen Fehlern kommen kann.\r\n\r\nIn diesem Beispiel machen wir uns zunutze das, wenn <code>super.paint(g)<\/code> fehlt, das Fenster die bereits gemalten Punkte beh\u00e4lt. Bei komplexeren Programmen ist es allerdings n\u00f6tig nach der Empfehlung von Oracle vorzugehen und <code>super.paint(g)<\/code> aufzurufen da es sonst zu unvorhersehbaren Seiteneffekten kommen kann. Selbst wenn es auf dem eigenen Rechner gut aussieht, kann es auf anderen Computern zu Darstellungsfehlern kommen.\r\nDa der super-Aufruf unsere alten Punkte l\u00f6scht m\u00fcssen wir uns also etwas anderes \u00fcberlegen. Die L\u00f6sung ist: Wir malen kurz vor dem Aufruf der paint-Methode auf eine virtuelle Tafel der alle Punkte enth\u00e4lt die wir gemalt haben. In der Paint-Methode selbst, lesen wir dann nur einmal die Tafel aus und bringen sie komplett auf den Bildschirm. Wir aktualisieren einfach nur den Bildschirm mithilfe unserer virtuellen Tafel. Dies hat auch eine Menge weiterer Vorteile die wir nach und nach kennenlernen wollen.\r\nAuf gehts.\r\n\r\n\r\n\r\n\r\n\r\n&nbsp;\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Jetzt werden wir auch schon das erste kleine Malprogramm schreiben: Wir legen ein neues Package an und erstellen darin eine Klasse mit Namen StartFenster: package miniMalen; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon; import java.awt.Shape; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.geom.Arc2D; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; public class StartFenster [&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\/336"}],"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=336"}],"version-history":[{"count":10,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/336\/revisions"}],"predecessor-version":[{"id":834,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/336\/revisions\/834"}],"wp:attachment":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/media?parent=336"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/categories?post=336"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/tags?post=336"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}