{"id":428,"date":"2018-10-17T11:06:54","date_gmt":"2018-10-17T09:06:54","guid":{"rendered":"https:\/\/freizone.net\/java-einfach-lernen\/?p=428"},"modified":"2020-05-11T19:29:39","modified_gmt":"2020-05-11T17:29:39","slug":"aktionen-ueberwachen","status":"publish","type":"post","link":"https:\/\/freizone.net\/java-einfach-lernen\/2018\/10\/17\/aktionen-ueberwachen\/","title":{"rendered":"Aktionen \u00fcberwachen"},"content":{"rendered":"<p>Erinnern wir uns noch an das Beispiel mit den drei Buttons im Kapitel Grundlagen der Objektorientierung? Wir haben nun genug Wissen um das Beispiel von Pseudo-Code in echten Code umzusetzen:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">package start;\r\n\r\nimport java.awt.event.ActionEvent;\r\nimport java.awt.event.ActionListener;\r\n\r\nimport javax.swing.JButton;\r\nimport javax.swing.JFrame;\r\n\r\npublic class DreiButtons extends JFrame {\r\n\r\n  public static void main(String[] args) {\r\n    \r\n    DreiButtons fenster = new DreiButtons();\r\n    \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    fenster.setVisible( true );\r\n\r\n    \r\n    JButton button1 = new Button(\"Text1\");\r\n    button1.setBounds(0, 0, 100, 30);\r\n    \r\n    JButton button2 = new Button(\"Text2\");\r\n    button2.setBounds(110, 0, 100, 30);\r\n    \r\n    JButton button3 = new Button(\"Abbruch\");\r\n    button3.setBounds(220, 0, 100, 30);\r\n    \r\n    fenster.add(button1);\r\n    fenster.add(button2);\r\n    fenster.add(button3);\r\n    \r\n  }\r\n\r\n\r\n}\r\n\r\nclass Button extends JButton implements ActionListener {\r\n\r\n  String beschriftung;\r\n  \r\n  Button(String t) {\r\n  this.setText(t);\r\n  this.addActionListener(this);\t\r\n  }\r\n  \r\n  @Override\r\n  public void actionPerformed(ActionEvent e) {\r\n    \r\n    if(this.getText() == \"Abbruch\") {\r\n      System.exit(0);\r\n    } else {\r\n      System.out.println( \"Meine Beschriftung lautet:\" + this.getText() );\t\t\r\n    }\r\n    \r\n  }\r\n  \r\n}\r\n<\/pre>\n<p>Die Klasse Button k\u00f6nnten wir nat\u00fcrlich auch in einer extra Datei auslagern. Der Einfachkeit halber lassen wir es hier aber so.<\/p>\n<p>Doch was ist ein ActionListener genau? Ein ActionListener ist ein sogenanntes Inferface. Ein Interface stellt der Klasse weitere Methoden zur Verf\u00fcgung die jedoch meist angepasst werden m\u00fcssen. In unserem Fall ist es die Methode <code>actionPerformed<\/code> die von Eclipse automatisch eingef\u00fcgt wird. <code>ActionPerformed<\/code> bekommt automatisch bei einem Klick die Variable <code>e<\/code> \u00fcbergeben. <code>e<\/code> ist ein Objekt vom Typ <code>ActionEvent<\/code>, das die Quelle des Klicks enth\u00e4lt.<\/p>\n<p>Hier hat praktisch jeder Button seinen eigenen ActionListener da er bereits in der Klasse integriert ist.<br \/>\nF\u00fcr kleinere Aufgabe mag dies so n\u00fctzlich sein. Bei gr\u00f6\u00dferen Oberfl\u00e4chen ist es jedoch meist g\u00fcnstiger gleich im JFrame den ActionListener zu implementieren. Dadurch ben\u00f6tigt man nur einen einzigen ActionListener in dem man alles behandeln kann.<br \/>\nAuch kann man dann das Objekt selbst mit dem ActionEvent vergleichen was in dem Beispiel nicht m\u00f6glich ist da noch kein button gebildet wurde und somit keine Referenz zur Verf\u00fcgung steht. Folgender Code w\u00fcrde also nicht funktionieren:<br \/>\n<code>...<\/code><br \/>\n<code>Object o = e.getSource();<\/code><br \/>\n<code>if(o == button1)<\/code><br \/>\n<code>...<\/code><\/p>\n<p>F\u00fcgt man den ActionListener erst sp\u00e4ter hinzu funktioniert es und man hat die M\u00f6glichkeit den Button direkt mit dem Ursprung der Aktion zu vergleichen. Besser ist es also so:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">package start;\r\n\r\nimport java.awt.event.ActionEvent;\r\nimport java.awt.event.ActionListener;\r\n\r\nimport javax.swing.JButton;\r\nimport javax.swing.JFrame;\r\n\r\npublic class DreiButtons extends JFrame implements ActionListener {\r\n  \r\n  JButton button1;\r\n  JButton button2;\r\n  JButton button3;\r\n  \r\n  public static void main(String[] args) {\r\n    \r\n    DreiButtons fenster = new DreiButtons();\t\t\r\n  }\r\n  \r\n  DreiButtons() {\r\n    \r\n    setBounds( 0, 0, 900, 500 );\r\n    setAlwaysOnTop( true );\r\n    setDefaultCloseOperation( EXIT_ON_CLOSE );\r\n    setLocationRelativeTo( null );\r\n    setVisible( true );\r\n    \r\n    initialisiereObjekte();\r\n  }\r\n\r\n  public void initialisiereObjekte() {\r\n    button1 = new JButton(\"Text1\");\r\n    button1.setBounds(0, 0, 100, 30);\r\n    button1.addActionListener(this);\r\n    \r\n    button2 = new JButton(\"Text2\");\r\n    button2.setBounds(110, 0, 100, 30);\r\n    button2.addActionListener(this);\r\n    \r\n    button3 = new JButton(\"Abbruch\");\r\n    button3.setBounds(220, 0, 100, 30);\r\n    button3.addActionListener(this);\r\n    \r\n    add(button1);\r\n    add(button2);\r\n    add(button3);\r\n  }\r\n\r\n\r\n  @Override\r\n  public void actionPerformed(ActionEvent e) {\r\n    Object o = e.getSource();\r\n    if(o == button3) {\r\n      System.exit(0);\r\n    } else {\r\n      System.out.print(\"Ich bin ein \" + o.getClass() );\r\n      JButton btn = (JButton) o;\r\n      System.out.print(\" mit der Beschriftung \" + btn.getText());\r\n      System.out.println();\r\n    }\r\n  }\r\n\r\n\r\n}\r\n\r\n\r\n<\/pre>\n<p>Da der ActionListener nicht aus einem statischen Kontext wie die Main-Methode heraus hinzugef\u00fcgt werden kann, m\u00fcssen wir zun\u00e4chst im Konstruktor den Frame erstellen und dann eine Methode aufrufen die nicht statisch ist.<br \/>\nAnders ausgedr\u00fcckt: Die Main-Methode geh\u00f6rt nicht wirklich zur Klasse. Sie ist eben nur der Einstieg. Da der ActionListener zur Klasse geh\u00f6rt und am Anfang noch kein Objekt dieser Klasse gebildet wurde, steht der ActionListener logischerweise auch noch nicht zur Verf\u00fcgung. Also m\u00fcssen wir zuerst ein Objekt unserer Klasse bilden.<br \/>\nAu\u00dferdem m\u00fcssen die Variablen f\u00fcr die Buttons <em>global<\/em> angelegt werden, da aus der Methode heraus nur in der eigenen Methode deklarierte Variablen gelesen werden k\u00f6nnen.\u00a0 Eine Variable ist global, wenn sie im Kopf der Klasse deklariert wird. Sie steht dann in allen Methoden zur Verf\u00fcgung. Eine Variable die in einer Methode deklariert wird nennt man lokal.<\/p>\n<p>Als n\u00e4chstes besch\u00e4ftigen wir uns etwas mit Mausaktionen.<\/p>\n<p><strong>Zusammenfassung<\/strong><\/p>\n<ul>\n<li>Ein Button braucht einen ActionListener um zu bemerken das auf ihn geklickt wurde und um reagieren zu k\u00f6nnen.<\/li>\n<li>Ein ActionListener ist stellt eine Methode zur Verf\u00fcgung in der wir programmieren was bei einem Klick passiert.<\/li>\n<li>globale Variablen sind \u00fcberall verf\u00fcgbar und werden im Kopf der Klasse deklariert.<\/li>\n<li>lokal nennt man Variablen die in einer Methode deklariert werden.<\/li>\n<li>Die Main-Methode ist nur der Einstieg zum Programm und k\u00f6nnte auch komplett ausgelagert werden. z.B. in eine main.java oder start.java<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Erinnern wir uns noch an das Beispiel mit den drei Buttons im Kapitel Grundlagen der Objektorientierung? Wir haben nun genug Wissen um das Beispiel von Pseudo-Code in echten Code umzusetzen: package start; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class DreiButtons extends JFrame { public static void main(String[] args) { DreiButtons fenster = [&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\/428"}],"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=428"}],"version-history":[{"count":13,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/428\/revisions"}],"predecessor-version":[{"id":896,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/posts\/428\/revisions\/896"}],"wp:attachment":[{"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/media?parent=428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/categories?post=428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/freizone.net\/java-einfach-lernen\/wp-json\/wp\/v2\/tags?post=428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}