{"id":422,"date":"2018-10-17T10:54:47","date_gmt":"2018-10-17T08:54:47","guid":{"rendered":"https:\/\/freizone.net\/java-einfach-lernen\/?p=422"},"modified":"2020-06-10T16:38:53","modified_gmt":"2020-06-10T14:38:53","slug":"eigene-grafikklasse-erstellen","status":"publish","type":"post","link":"https:\/\/freizone.net\/java-einfach-lernen\/2018\/10\/17\/eigene-grafikklasse-erstellen\/","title":{"rendered":"Eigene Grafikklasse erstellen"},"content":{"rendered":"<p>Jetzt wollen wir eigene Grafikobjekte erstellen. Einen Pfeil, und dann Pfeile in verschiedenen Ausrichtungen. Um einen Pfeil zu zeichnen k\u00f6nnten wir wie folgt vorgehen:<\/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\npublic class Pfeilbeispiel extends JFrame {\r\n\r\n  public static void main(String[] args) {\r\n    \r\n  Pfeilbeispiel fenster = new Pfeilbeispiel();\r\n  \r\n  fenster.setVisible( true );\r\n  fenster.setBounds( 0, 0, 900, 500 );\r\n  fenster.setAlwaysOnTop( true );\r\n  fenster.setDefaultCloseOperation( EXIT_ON_CLOSE );\r\n  fenster.setLocationRelativeTo( null );\r\n\r\n        int[] x = {50,50,90,90,150,90,90,50}; \/\/ 8 x-Koordinatenpunkte, Pixel horizontal von links\r\n        int[] y = {55,85,85,110,70,30,55,55}; \/\/ 8 y-Koordinatenpunkte, Pixel vertikal von oben\r\n\r\n\r\n  JPanel panel = new JPanel() {\r\n    public void paint(Graphics g) {\r\n      super.paint(g);\r\n      g.setColor(Color.black);\r\n      g.drawPolyline(x,y,8);\r\n    }\r\n  };\r\n\r\n  panel.setBounds(0, 0, 1000, 500);\r\n  panel.setBackground(Color.white);\r\n  fenster.add(panel);\r\n  \r\n  }\r\n}\r\n<\/pre>\n<p>Hier erstellen wir zwei<em> int-Arrays<\/em> und speichern darin die x\/y Koordinaten (x f\u00fcr die horizontale, y f\u00fcr die vertikale. Immer in Pixel vom Fensterrand oben bzw. links). Ein Array ist ein Speicherbereich der mehrere Werte speichern kann.<br \/>\nIm JPanel zeichnen wir dann mit <em>drawPolyline<\/em> das Polygon. Die Anweisung erwartet in den ersten beiden Angaben jeweils ein Array f\u00fcr x und y. Die letzte Angabe beinhaltet die Punktanzahl die gesetzt wird.<\/p>\n<p>Falls wir nun einen Pfeil zeichnen wollen, m\u00fcssten wir jedesmal die Koordinaten\u00a0direkt in den Quellcode kopieren, je nachdem in welche Richtung der Pfeil zeigen soll. Dies wollen wir vereinfachen.<\/p>\n<p>Wir wollen nun folgendes erreichen:<br \/>\nWir wollen eine Klasse schreiben die alle Pfeile beinhaltet und von der wir schlie\u00dflich einfach mit:<br \/>\nPfeil linkerPfeil = new Pfeil();<br \/>\nein Objekt bilden k\u00f6nnen, auf das wir dann einfach in der paint-Methode zugreifen k\u00f6nnen. z.B. so:<br \/>\ng.drawPolyline( linkerPfeil.getX, linkerPfeil.getY, linkerPfeil.getPunkte );<\/p>\n<p>oder noch besser wir wollen gar nicht erst die paint-Methode \u00fcberschreiben sondern das Objekt soll uns ein JPanel liefern das wir nur noch auf unser Fenster setzen:<br \/>\nPfeile pfeil = new Pfeile();<br \/>\npanel.add(pfeil.LINKS);<br \/>\npanel.add(pfeil.RECHTS);<\/p>\n<p>Ausserdem sollten wir noch die M\u00f6glichkeit haben auch noch die Farbe und Position des Pfeils bestimmen zu k\u00f6nnen, also z. B. pfeil.LINKS(Position, Farbe).<\/p>\n<p>Zun\u00e4chst wollen wir die einfachste L\u00f6sung umsetzen und dann die Klasse nach und nach\u00a0 komplexer werden lassen.<\/p>\n<p>Wir erstellen eine neue Klasse mit Namen Pfeilhelfer und setzen folgenden Quellcode ein:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">package start;\r\nimport java.awt.Color;\r\nimport java.awt.Graphics;\r\nimport java.awt.Point;\r\nimport javax.swing.JPanel;\r\n\r\npublic class Pfeilhelfer {\r\n  \r\n private int[] x = {50,50,90,90,150,90,90,50};\r\n private int[] y = {55,85,85,110,70,30,55,55};\r\n\r\n  public Pfeilhelfer() {}\r\n  \r\n  public int[] getXArr() {\r\n    return this.x;\t\r\n  }\r\n  \r\n  public int[] getYArr() {\r\n    return this.y;\t\r\n  }\r\n  \r\n}<\/pre>\n<p>Die Klasse enth\u00e4lt die beiden Arrays f\u00fcr die x und y Koordinaten sowie einen Standard-Konstruktor und zwei sogenannte Getter die gew\u00e4hrleisten das die Daten gekapselt sind. Was das genau bedeutet erkennen wir wenn wir die Einstiegsmethode schreiben.<\/p>\n<p>Da bei gr\u00f6\u00dferen Programmen f\u00fcr Objekte meist eigene Dateien angelegt werden, wollen wir auch so vorgehen und die Einstiegsmethode zusammen mit dem Frame in eine eigene Datei schreiben.<br \/>\nWir legen eine neue Klasse mit Namen Tafel2 an und geben folgenden Code ein:<\/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 Tafel2 extends JFrame {\r\n\r\n  public static void main(String[] args) {\r\n\r\n    Tafel2 zeichnen = new Tafel2();\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.setLayout(null);\r\n    zeichnen.getContentPane().setBackground(Color.white);;\r\n    zeichnen.setTitle(\"Zeichnen in Java\");\t\r\n    zeichnen.setVisible( true ); \r\n\r\n    Pfeilhelfer pfeil = new Pfeilhelfer();\r\n    \r\n    JPanel panel = new JPanel() {\r\n      public void paint(Graphics g) {\t\r\n        super.paint(g);\r\n        g.drawPolyline(pfeil.getXArr(),pfeil.getYArr(),8);\r\n      }\r\n    };\r\n    panel.setBounds(100, 100, 200, 150);\r\n    panel.setBackground(Color.WHITE);\r\n    zeichnen.add(panel);\r\n  } \t\t\r\n}<\/pre>\n<p>Wir sehen das wir nun nach dem bilden des Pfeilhelferobjekts, anschlie\u00dfend in der paint-Methode bequem auf das X- und Y-Array des Pfeils zugreifen k\u00f6nnen. Die Methode liefert einen <em>R\u00fcckgabewert<\/em> den wir mit <em>return<\/em> festgelegt haben. Wenn wir in der Pfeilhelfer-Klasse das <em>private\u00a0<\/em>beim initialisieren der X- und Y-Arrays weglassen, k\u00f6nnen wir beim Methodenaufruf von pfeil in der Liste sowohl das X wie auch das Y-Array direkt ohne den Getter einlesen. Dies ist jedoch nicht ratsam da wir nicht wollen das jemand den Pfeil ver\u00e4ndert. Schlie\u00dflich k\u00f6nnte man dann auch schreiben:<br \/>\n<code>pfeil.x[0] = 700;<\/code><br \/>\ndas die erste X-Koordinate auf 700 setzen w\u00fcrde, was wir definitiv nicht wollen. Die Koordinaten sind ja fehlerfrei und sollen so bleiben. Das Schl\u00fcsselwort <em>private<\/em> versetzt uns also in die Lage, festzulegen welche Daten nur zum Abruf bereitstehen und bei welchen es Sinn macht sie zu ver\u00e4ndern. W\u00fcrden wir wollen das man die Koordinaten ver\u00e4ndern kann, w\u00fcrden wir noch eine <em>Setter-Methode<\/em> hinzuf\u00fcgen.<br \/>\nAls n\u00e4chstes k\u00f6nnen wir nat\u00fcrlich f\u00fcr jeden Pfeil eine extra Klasse schreiben. Aber wir k\u00f6nnen nat\u00fcrlich auch alle in eine schreiben. Wir haben dann praktisch eine &#8222;Pfeilfabrik&#8220; mit der wir unterschiedliche Pfeile herstellen k\u00f6nnen:<\/p>\n<p>Pfeilfabrik.java<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">package start;\r\nimport java.awt.Color;\r\nimport java.awt.Graphics;\r\nimport java.awt.Point;\r\nimport javax.swing.JPanel;\r\n\r\npublic class Pfeilfabrik {\r\n  \r\n  private int[] rx = {50,50,90,90,150,90,90,50};\r\n  private int[] ry = {55,85,85,110,70,30,55,55};\r\n  \r\n  private int [] lx = {150,150,110,110,50,110,110,150};\r\n  private int [] ly = {55,85,85,110,70,30,55,55};\r\n  \r\n  private int anzahl = 8;\r\n  \r\n  public Pfeilfabrik() {}\r\n  \r\n  public int[] rechtsX() {\r\n    return this.rx;\t\r\n  }\r\n  \r\n  public int[] rechtsY() {\r\n    return this.ry;\t\r\n  }\r\n  public int[] linksX() {\r\n    return this.lx;\t\r\n  }\r\n  \r\n  public int[] linksY() {\r\n    return this.ly;\t\r\n  }\r\n  \r\n  public int getAnzahl() {\r\n    return this.anzahl;\r\n  }\r\n  \r\n}\r\n\r\n<\/pre>\n<p>Im Endeffekt nicht viel komplexer als die vorherige Klasse, nur das es jetzt die Daten f\u00fcr zwei verschiedene Pfeile enth\u00e4lt und dementsprechende <em>getter.\u00a0<\/em>Nat\u00fcrlich m\u00fcssen wir auch die Tafel2.java anpassen:<\/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\npublic class Tafel2 extends JFrame {\r\n\r\n  public static void main(String[] args) {\r\n\r\n    Tafel2 zeichnen = new Tafel2();\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.setLayout(null);\r\n    zeichnen.getContentPane().setBackground(Color.white);\r\n    zeichnen.setTitle(\"Zeichnen in Java\");\t\r\n    zeichnen.setVisible( true ); \r\n\r\n    Pfeilfabrik pfeil = new Pfeilfabrik();\r\n    \r\n    JPanel panel = new JPanel() {\r\n      public void paint(Graphics g) {\t\r\n        super.paint(g);\r\n        g.drawPolyline(pfeil.linksX(),pfeil.linksY(),pfeil.getAnzahl());\r\n      }\r\n    };\r\n    panel.setBounds(100, 100, 200, 150);\r\n    panel.setBackground(Color.WHITE);\r\n    zeichnen.add(panel);\r\n  } \t\t\r\n}<\/pre>\n<p>Je nachdem ob wir nun pfeil.linksX oder pfeil.rechtsX eingeben gibt das Objekt <em>pfeil<\/em> andere Koordinaten zur\u00fcck.<\/p>\n<p>Anspruchsvoller wird das ganze wenn wir zu Beginn angek\u00fcndigt, unsere Pfeilfabrik gleich ein JPanel zur\u00fcckliefern lassen:<\/p>\n<p>Klasse Pfeilfabrik:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">package start;\r\nimport java.awt.Color;\r\nimport java.awt.Graphics;\r\nimport java.awt.Point;\r\nimport javax.swing.JPanel;\r\n\r\npublic class Pfeilfabrik extends JPanel {\r\n  \r\nint [] rx = {50,50,90,90,150,90,90,50};\r\nint [] ry = {55,85,85,110,70,30,55,55};\r\n\r\nint [] lx = {150,150,110,110,50,110,110,150};\r\nint [] ly = {55,85,85,110,70,30,55,55};\r\n\r\nint [] ox = {80,110,110,135,95,55,80,80}; \r\nint [] oy = {130,130,90,90,30,90,90,130}; \r\n\r\nint [] ux = {80,110,110,135,95,55,80,80};\r\nint [] uy = {30,30,70,70,130,70,70,30};\r\n\r\nint[] x;\r\nint[] y;\r\n\r\nint anzahlpunkte = 8;\r\n\r\nPoint p;\r\n\r\nColor farbe;\r\n\r\npublic Pfeilfabrik () {\r\n  this.farbe = Color.BLACK;\r\n}\r\n\r\npublic Pfeilfabrik (Color c) {\r\n  this.farbe = c;\r\n}\r\n\r\n\r\n\r\npublic Pfeilfabrik RECHTS(Point p) {\r\n  Pfeilfabrik pfeil = new Pfeile(this.farbe);\r\n  pfeil.x = this.rx;\r\n  pfeil.y = this.ry;\r\n  pfeil.p = p;\r\n  return pfeil;\r\n}\r\n\r\npublic Pfeilfabrik LINKS(Point p) {\r\n  Pfeilfabrik pfeil = new Pfeile(this.farbe);\r\n  pfeil.x = this.lx;\r\n  pfeil.y = this.ly;\r\n  pfeil.p = p;\r\n  return pfeil;\r\n}\r\n\r\npublic Pfeilfabrik OBEN(Point p) {\r\n  Pfeilfabrik pfeil = new Pfeile(this.farbe);\r\n  pfeil.x = this.ox;\r\n  pfeil.y = this.oy;\r\n  pfeil.p = p;\r\n  return pfeil;\r\n}\r\n\r\npublic Pfeilfabrik UNTEN(Point p) {\r\n  Pfeilfabrik pfeil = new Pfeile(this.farbe);\r\n  pfeil.x = this.ux;\r\n  pfeil.y = this.uy;\r\n  pfeil.p = p;\r\n  return pfeil;\r\n}\r\n\r\n\r\npublic void paint(Graphics g) {\r\n  super.paint(g);\r\n  this.setBounds(this.p.x, this.p.y, 200, 150);\r\n  g.setColor(this.farbe);\r\n  g.drawPolyline(x,y,anzahlpunkte);\t\r\n}\r\n\r\n\r\n}\r\n\r\n<\/pre>\n<p><code>extends JPanel<\/code> bewirkt das unsere Klasse alle Eigenschaften und Methoden von JPanel erbt. Es ist quasi schonmal ein JPanel plus die Eigenschaften und Methoden die wir eben hinzuf\u00fcgen.<br \/>\nWas den Konstruktor betrifft, verwenden wir hier sogenannte <em>\u00fcberladene Konstruktoren<\/em>. Da wir schon bei der Erstellung des Objekts die Farbe aller sp\u00e4teren Pfeile angeben wollen, \u00fcbergeben wir dem Konstruktor eine Farbe (Zeile 36). F\u00fcr den Fall das wir keine Farbe \u00fcbergeben, ruft der Compiler den Standardkonstruktor auf in dem wir schwarz als Standardfarbe definieren ( Zeile 32).<\/p>\n<p>F\u00fcr jeden Pfeil schreiben wir eine Methode welcher wir ein Point-Objekt \u00fcbergeben das die Koordinaten der Pfeilposition enth\u00e4lt. Wir rufen den zweiten Konstruktor auf und erstellen ein neues Objekt dessen x und y Variablen wir die entsprechenden Arrays des Pfeils zuweisen. Schlie\u00dflich geben wir dieses Objekt zur\u00fcck. Da unser Objekt die Klasse JPanel geerbt hat, erhalten wir ein JPanel in dessen paint-Methode unser Pfeil gezeichnet wird (Zeile 75).<\/p>\n<p>Klasse Pfeilbeispiel:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">package start;\r\n\r\nimport java.awt.Color;\r\nimport java.awt.Point;\r\nimport javax.swing.JFrame;\r\nimport javax.swing.JPanel;\r\n\r\npublic class Pfeilbeispiel extends JFrame {\r\n\r\n public static void main(String[] args) {\r\n    \r\n Pfeilbeispiel fenster = new Pfeilbeispiel();\r\n  \r\n fenster.setVisible( true );\r\n fenster.setBounds( 0, 0, 900, 500 );\r\n fenster.setAlwaysOnTop( true );\r\n fenster.setDefaultCloseOperation( EXIT_ON_CLOSE );\r\n fenster.setLocationRelativeTo( null );\r\n  \r\n Color c;\r\n c = new Color(100,200,50); \r\n Point p = new Point(500,100);\r\n  \r\n JPanel panel = new JPanel();\r\n panel.setBounds(0, 0, 1000, 500);\r\n panel.setBackground(Color.DARK_GRAY);\r\n\r\n fenster.add(panel);\t\r\n\r\n Point p1 = new Point(0,0);\r\n\r\n Point p2 = new Point(200,0);\r\n\r\n Pfeilfabrik pfeil = new Pfeilfabrik(Color.BLUE);\r\n\r\n panel.add(pfeil.LINKS(p1));\r\n panel.add(pfeil.RECHTS(p2));\r\n panel.add(pfeil.OBEN(new Point(0,150)));\r\n panel.add(pfeil.UNTEN(new Point(200,150)));\r\n }\r\n}\r\n<\/pre>\n<p>Hier werden am Ende unsere vier Pfeile gebildet. In den letzten beiden Zeilen \u00fcbergeben wir den Point direkt.<\/p>\n<p>Jetzt habt ihr euch aber einen Kaffee verdient. Genie\u00dft ihn.<\/p>\n<p>Als n\u00e4chstes wollen wir uns dann etwas mit Buttons und deren \u00dcberwachung besch\u00e4ftigen.<\/p>\n<p><strong>Zusammenfassung<\/strong><\/p>\n<ul>\n<li>Ein Array enth\u00e4lt mehrere Variablen gleichen Typs<\/li>\n<li>mit dem Befehl <em>return<\/em> k\u00f6nnen wir festlegen welches Ergebnis eine Methode zur\u00fcckliefert<\/li>\n<li>Ein Point-Objekt enth\u00e4lt zwei Koordinaten: x und y.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jetzt wollen wir eigene Grafikobjekte erstellen. Einen Pfeil, und dann Pfeile in verschiedenen Ausrichtungen. Um einen Pfeil zu zeichnen k\u00f6nnten wir wie folgt vorgehen: package start; import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class Pfeilbeispiel extends JFrame { public static void main(String[] args) { Pfeilbeispiel fenster = new Pfeilbeispiel(); fenster.setVisible( true ); fenster.setBounds( [&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\/422"}],"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=422"}],"version-history":[{"count":16,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/422\/revisions"}],"predecessor-version":[{"id":1009,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/422\/revisions\/1009"}],"wp:attachment":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/media?parent=422"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/categories?post=422"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/tags?post=422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}