{"id":413,"date":"2018-10-08T12:33:51","date_gmt":"2018-10-08T10:33:51","guid":{"rendered":"https:\/\/freizone.net\/java-einfach-lernen\/?p=413"},"modified":"2020-05-11T19:29:40","modified_gmt":"2020-05-11T17:29:40","slug":"grafiken-erstellen","status":"publish","type":"post","link":"https:\/\/freizone.net\/java-einfach-lernen\/2018\/10\/08\/grafiken-erstellen\/","title":{"rendered":"Grafiken erstellen"},"content":{"rendered":"<p>Jetzt k\u00f6nnen wir endlich zum zeichnen anfangen.<\/p>\n<p>Wir erstellen eine neue Klasse mit Namen &#8222;Tafel&#8220; mit folgendem Inhalt:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">package start;\r\n\r\nimport java.awt.Color;\r\nimport java.awt.Graphics;\r\n\r\nimport javax.swing.JFrame;\r\nimport javax.swing.JPanel;\r\n\r\n\r\npublic class Tafel extends JFrame {\r\n\r\n  public static void main(String[] args) {\r\n\r\n    Tafel zeichnen = new Tafel();\r\n    zeichnen.setDefaultCloseOperation( EXIT_ON_CLOSE );\r\n    zeichnen.setBounds( 0, 0, 500, 500 );\r\n    zeichnen.setLocationRelativeTo( null );\r\n    zeichnen.setAlwaysOnTop( true );\r\n    zeichnen.setTitle(\"Zeichnen in Java\");\r\n\r\n    \/\/\u00a0wird\u00a0definiert\u00a0aber\u00a0ohne\u00a0super()\u00a0in\u00a0der\u00a0paint()\u00a0nicht\u00a0gezeichnet\t\r\n    zeichnen.getContentPane().setBackground(Color.BLUE); \r\n    zeichnen.setVisible( true ); \r\n            \r\n  } \r\n  \r\n  \r\n  public void paint(Graphics g) {\r\n\r\n    super.paint(g) \/\/ ohne diesen Aufruf wird nur der Kreis gezeichnet, der Hintergrund nicht.\t\r\n    \r\n    g.setColor(Color.YELLOW);\r\n    g.fillOval(50, 50, 100, 100);  \/\/ fillOval(x, y, Breite, H\u00f6he)  \r\n    \r\n  }\r\n  \r\n  \r\n}<\/pre>\n<p>Wie wir schon gelernt haben wird unsere Klasse Tafel hier um die Klasse <em>JFrame <\/em>erweitert. JFrame ist ein Fenster, deswegen wird, sobald wir ein Objekt aus unserer Klasse bilden ein Fenster ge\u00f6ffnet.<br \/>\nUm auf unserer Tafel malen zu k\u00f6nnen m\u00fcssen wir ihr eine <em>paint-Methode<\/em> geben (Zeile 26).<br \/>\nDer paint-Methode wird vom System eine <em>Graphics<\/em>-Klasse \u00fcbergeben das Metadaten \u00fcber den Bereich in dem gezeichnet werden soll enth\u00e4lt. Z.B. die Vordergrundfarbe sowie den Bildschirmausschnitt auf dem gezeichnet wird. Ausserdem enth\u00e4lt es verschiedene Methoden zum malen. Diese Methoden nutzen wir im Beispiel um zuerst die Vordergrundfarbe einzustellen und dann um einen Kreis zu zeichnen (Zeilen 28 und 29).<\/p>\n<p>Die Hintergrundfarbe haben wir zwar in Zeile definiert, wird aber nicht angezeigt. Der Bildschirm bleibt weiss. Das hat mit einer Eigenheit von Java zu tun. Man kann nicht direkt auf einen JFrame schreiben, da Java automatisch eine sogenannte <em>ContentPane<\/em> erstellt. Das ist ein unsichtbarer Container der die einzelnen Grafiken ordnet. Um also den Hintergrund zu \u00e4ndern muss man, wie in Zeile 20 zu sehen erst die ContentPane holen und dann dort den Hintergrund einstellen. Unsere Methode paint() bezieht sich jedoch auf unsere Klasse Tafel auch wenn diese einen JFrame enth\u00e4lt. Deswegen werden nur die Grafiken die wir in unserer paint-Methode definieren, gezeichnet. Um auch den Hintergrund zu zeichnen, m\u00fcssen wir die paint-Methode der Elternklasse aufrufen. Also die von JFrame. Dies k\u00f6nnen wir gleich am Anfang unserer paint-Methode mit <code>super.paint(g)<\/code> machen. Theoretisch k\u00f6nnte man auch stattdessen <code>this.paintComponents(g)<\/code> aufrufen um explizit alle Komponenten auf der Tafel zu zeichnen, aber <code>super.paint(g)<\/code> ist nicht nur der elegantere Weg, es ist auch der, den Oracle also der Hersteller von Java <a href=\"https:\/\/www.oracle.com\/technetwork\/java\/painting-140037.html\">hier empfiehlt<\/a>.<br \/>\nDa diese Problematik nicht nur background sondern auch andere, die ContentPane betreffende Einstellungen betrifft, wollen wir unseren Code generell anders aufbauen:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">package start;\r\n\r\nimport java.awt.Color;\r\nimport java.awt.Graphics;\r\nimport javax.swing.JFrame;\r\nimport javax.swing.JPanel;\r\n\r\n\r\npublic class Tafel extends JFrame {\r\n\r\n  public static void main(String[] args) {\r\n\r\n    Tafel zeichnen = new Tafel();\r\n    zeichnen.setDefaultCloseOperation( EXIT_ON_CLOSE );\r\n    zeichnen.setBounds( 0, 0, 900, 500 );\r\n    zeichnen.setLocationRelativeTo( null );\r\n    zeichnen.setAlwaysOnTop( true );\r\n    zeichnen.setTitle(\"Zeichnen in Java\");\r\n    zeichnen.setVisible( true ); \t\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(100, 100, 10, 10);\t\r\n                \t  \r\n     }\r\n    \r\n    };\r\n  \r\n    panel.setBackground( new Color( 255, 255, 255 ) );\r\n    zeichnen.add(panel);\r\n            \r\n  } \r\n}<\/pre>\n<p>Hier bilden wir erst ein <em>JPanel<\/em> aus und \u00fcberschreiben direkt die Methode paint() des JPanels. Ein JPanel ist ein einfacher leerer Container der Komponenten, z.B. Buttons oder Grafiken aufnehmen kann.<br \/>\nDanach setzen wir das panel auf unser Tafelobjekt das wir <em>zeichnen<\/em> genannt haben.<br \/>\nNun k\u00f6nnen wir beliebige Objekte die uns unsere Graphics-Klasse bietet, in der paint-Methode des Panels. positionieren. Schreiben wir &#8218;g&#8216; und setzen einen &#8218;.&#8216; Punkt, dann sollte sich in Eclipse das Men\u00fc \u00f6ffenen. Geben wir &#8218;Draw&#8216; ein, zeigt uns er alle Methoden die uns grafische Objekte malen lassen. Wenn wir solch eine Methode einmal anklicken, sagt uns Eclipse welche Werte diese Methode erwartet und was es zur\u00fcckgibt. Mit R\u00fcckgabewerten und einigen dieser Methoden wollen wir uns nun n\u00e4her besch\u00e4ftigen.<\/p>\n<p><strong>Zusammenfassung<\/strong><\/p>\n<ul>\n<li><span style=\"font-size: 1rem;\">Ein JFrame ist ein Fenster<\/span><\/li>\n<li><span style=\"font-size: 1rem;\">J<\/span>edes Objekt hat eine paint-Methode f\u00fcr die eigene Darstellung.<\/li>\n<li>Die paint-Methode kann \u00fcberschrieben werden.<\/li>\n<li>super.paint(g) ruft die paint-Methode der \u00fcbergeordneten Klasse, der Elternklasse, auf.<\/li>\n<li>Man sollte Grafikobjekte nicht direkt auf den JFrame, sondern immer in einen Container wie JPanel setzen.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Jetzt k\u00f6nnen wir endlich zum zeichnen anfangen. Wir erstellen eine neue Klasse mit Namen &#8222;Tafel&#8220; mit folgendem Inhalt: package start; import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class Tafel extends JFrame { public static void main(String[] args) { Tafel zeichnen = new Tafel(); zeichnen.setDefaultCloseOperation( EXIT_ON_CLOSE ); zeichnen.setBounds( 0, 0, 500, 500 ); zeichnen.setLocationRelativeTo( [&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\/413"}],"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=413"}],"version-history":[{"count":9,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/413\/revisions"}],"predecessor-version":[{"id":890,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/413\/revisions\/890"}],"wp:attachment":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/media?parent=413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/categories?post=413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/tags?post=413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}