-1- Inhalt 1 Hauptfenster........................................................................................................................... 2 1.1 Neues Projekt erstellen ....................................................................................................................2 1.2 Komponenten einfügen ...................................................................................................................4 1.2.1 Menü ...........................................................................................................................................4 1.2.2 Symbolleiste................................................................................................................................5 1.2.3 Statuszeile ...................................................................................................................................5 1.2.4 Container mit Scrollbalken .........................................................................................................5 1.2.5 ComboBox ..................................................................................................................................5 1.2.6 Zeichenfläche (Panel) .................................................................................................................6 2 Ereignisse verarbeiten .......................................................................................................... 6 2.1 Mausereignisse ................................................................................................................................7 2.1.1 Mausklick (Event „mousePressed“) .....................................................................................7 2.1.2 Mausbewegung ohne gedrückter Maustaste (Event „mouseMoved“) .....................................7 2.1.3 Mausbewegung mit gedrückter Maustaste (Event „mouseDragged“) ........................................7 2.1.4 Maus wird in Komponente bewegt (Event „mouseEntered“) ....................................................7 2.1.5 Maus verlässt Komponente (Event „mouseExited“) ..................................................................8 2.2 Klick auf Buttons (Event „actionPerformed“) ................................................................................8 2.3 Tastaturereignisse ............................................................................................................................8 2.3.1 Druckbare Zeichen (Event „keyTyped“) ....................................................................................8 2.3.2 Tastencode (Event „KeyPressed“) ..............................................................................................9 2.3.3 Sonderfall „paintComponent“...................................................................................................10 2.4 Timer-Events .................................................................................................................................11 -2- 1 Hauptfenster 1.1 Neues Projekt erstellen File → New Project → Java → Java Application → Next Ordner wählen, in dem das Projekt erstellt werden soll „Create Main Class“ ausschalten! → Finish Im „Projects“ - Fenster (wenn nicht sichtbar: im Menü „Windows“ aktivieren) Mausklick rechts auf „Source Packages“ → „New“ → „Java Package“. Gewünschten Namen des Packages eingeben (keine Leerzeichen erlaubt!) → Finish Im Projects-Fenster dieses neue (und einzige) Package mit Mausklick links selektieren, um eine neue Klasse in diesem Package zu erstellen (wird unser Hauptfenster). File → New File → Swing GUI Forms → JFrame Form → Next Namen der Klasse eingeben (da es unser Hauptfenster werden soll, aussagekräftigen Namen verwenden, z.B. „Hauptfenster“ oder „MainFrame“) → „Finish“ -3- Die Ansicht wechselt automatisch in die „Design View“, in die mit mit Mausklick Komponenten eingefügt werden können: Verfügbare Komponenten Eigenschaften der momentan (im Hauptfenster) ausgewählten Komponente (in unserem Beispiel: das Hauptfenster selbst) Rechts (im Fenster „Palette“) befinden sich alle verfügbaren Komponenten. Mit Linksklick Komponente auswählen und mit zweitem Klick in unserem Hauptfenster ablegen. Im unteren Teil befindet sich das Eigenschaften („properties“) - Fenster zur momentan im Hauptfenster ausgewählten Komponente (Hintergrundfarbe, Größe, ...) Da wir im ersten Schritt „Create Main Class“ ausgeschalten haben, weiß Java noch nicht, wo sich die „main“-Methode befindet, die jedes Java-Programm haben muss (und nach dem Start aufgerufen wird). Wenn wir mit F6 unser Programm zum ersten Mal starten, fragt Netbeans daher, welche Klasse die „main“-Methode bekommen soll (z.Z. gibt´s nur das „Hauptfenster“). Mit OK bestätigen → Netbeans fügt eine „main“ - Methode ein und startet dort das Hauptfenster mit der Anweisung new Hauptfenster().setVisible(true); Zur Quellcode-Ansicht wechseln wir mit Klick auf „Source“ (oder Strg+Alt+Bild↑): Netbeans hat für uns bereits einige Zeilen geschrieben: -4- Package Klasse „Hauptfenster“ Konstruktor Hauptfenster Aufruf der Methode „initComponents“: in dieser Methode fügt Netbeans automatisch den Code ein, der die einzelnen Komponenten erzeugt und ins Fenster einbaut Methode „main“ Hauptfenster erzeugen und sichtbar machen 1.2 Komponenten einfügen Wenn das Fenster mit den zur Auswahl stehenden Komponenten nicht sichtbar ist, im Menü „Window/IDE Tools/Palette“ einblenden. Das Eigenschaften-Fenster („Properties“) wird im Menü „Window/IDE Tools/Properties“ sichtbar gemacht. 1.2.1 Menü Palette „Swing Menus“ - MenuBar (Klasse JMenuBar), an beliebige Stelle im Fenster klicken - Menüs werden automatisch am oberen Rand fixiert. MenuBar dient als „Container“ für die eigentlichen menüeinträge. Mausklick rechts auf den ersten Eintrag („File“) → Add From Palette / Menu Item (Klasse JMenuItem). Mausklick rechts auf Eintrag → Edit Text ändert die Beschriftung, Change Variable Name ändert den Namen (= Name der Instanz dieses Menüeintrags, wird für Zugriff benötigt). Sollen die Menübefehle auch über Tastenkombinationen („Shortcuts“ oder „Accelerators“) aufgerufen werden können, müssen sie den MenüItems bekanntgegeben werden: Doppelklick auf „shortcut“ neben dem Menüeintrag → Klick ins Feld „Key Stroke“ → gewünschte Tastenkombination drücken (z.B. „Strg“ und „P“ für „Drucken“): -5- gewünschte Tastenkombination drücken 1.2.2 Symbolleiste Palette „Swing Containers“ - Tool Bar (Klasse JToolBar). Wenn man sie genau unter der Menüleiste platziert und in der Breite bis zum Fensterrand ausdehnt, passt sie sich an die Fensterbreite an. Mit Mausklick rechts in diese Toolbar → Add From Palette → Swing Controls können Schalter (Button - Klasse JButton) usw. eingefügt werden. 1.2.3 Statuszeile Statuszeilen befinden sich normalerweise am unteren Fensterrand und enthalten Infos (z.B. aktuelle Seite in einer Textverarbeitung). Es gibt zwar keine Komponente „Statuszeile“, aber mit einem Panel (JPanel) aus der Palette „Swing Containers“ kann sie nachgebildet werden. Platziert man dieses Panel am unteren Fensterrand und zieht die Breite bis zum rechten Fensterrand, passt sie sich automatisch an die Fensterbreite an. Mit Mausklick rechts → Add From Palette → Swing Controls können Objekte hinzugefügt werden (meist Labels - Klasse JLabel). Standardmäßig sitzen sie in der Mitte der Statuszeile, das lässt sich aber leicht ändern: Mausklick rechts in die Statuszeile → SetLayout → FlowLayout. In den Properties wird jetzt das Feld „Alignment“ angezeigt → Klick auf den Pfeil → „Left“. 1.2.4 Container mit Scrollbalken Der eigentliche Inhalt unseres Programms (egal, ob Textverarbeitung oder Bildbearbeitung, etc.) wird normalerweise nicht direkt ins Fenster geschrieben, sondern auf eine eigene Zeichenfläche. Da sie in der Regel keine fixe Größe besitzt, sondern mit dem Inhalt wachsen soll, benötigen wir einen Container, der bei Bedarf Scrollbalken einblendet: in der Palette „Swing Containers“ → Scroll Pane (Klasse JScrollPane) auswählen und in unser Hauptfenster klicken. Auch diese Komponente passt sich automatisch an die Fenstergröße an, wenn wir sie bis zum Fensterrand ziehen. 1.2.5 ComboBox Eine ComboBox (Klasse JComboBox) besteht aus einer aufklappbaren Liste und einem TextEingabefeld. Einträge in die Liste werden nach Klick auf die drei Punkte neben „Model“ im PropertiesFenster eingegeben. Einfach die gewünschten Werte eintippen (mit Taste „Enter“ beginnt man einen neuen Eintrag): -6- 1.2.6 Zeichenfläche (Panel) In die ScrollPane setzen wir die eigentliche Zeichenfläche, üblicherweise ein Panel (Klasse JPanel): in der Palette „Swing Containers“ → Panel. Die Hintergrundfarbe dieser Zeichenfläche kann man in den Eigenschaften (Properties-Fenster) ändern (Mausklick auf die drei Punkte neben „Background“) Wenn wir (in den „Properties - PreferredSize“ oder während des Programmlaufs mit der Anweisung „setPreferredSize“) die Zeichenfläche größer als die Scrollpane machen, werden automatisch in der Scrollpane Bildlaufleisten sichtbar. Auch das Mausrad funktionert bereits. 2 Ereignisse verarbeiten Um auf ein Ereigniss (Mausklick, Tastendruck, ...) reagieren zu können, benötigt man einen „Event - Listener“, d.h. eine Klasse, die diejenige Methode enthält, die aufgerufen wird, wenn das Ereignis eintrifft. Wir müssen sie nicht vollständig per hand Erzeugen, Netbeans nimmt uns einige Arbeit ab: in den Properties findet sich eine Registerkarte „Events“, die (fast) alle Ereignisse auflistet, die von der ausgewählten Komponente ausgelöst werden können. Klick auf den Pfeil zeigt einen vorgeschlagenen Namen für die Methode, die das Ereignis verarbeiten soll, zweiter Klick darauf erzeugt sie und wechselt in die Codeansicht: Diese Methode, die das Ereignis verarbeitet, nennt man „Eventhandler“. In der Codeansicht können wir in der „TODO“ - Zeile unsere Anweisungen eingeben, der graue Bereich kann nicht geändert werden. Löschen der gesamten Methode ist nur über dasselbe Event-Fenster möglich, in dem wir sie erzeugt haben (Klick auf den dort neben dem Event angezeigten Methodennamen und „Entf“ drücken). Oft werden -7- mit dem Ereignis weiter Daten mitgeschickt (bei Mausbewegungen z.B. die Koordinaten). Sie befinden sich im Parameter „evt“ („evt.getX()“ liefert z.B. die x-Koordinate). 2.1 2.1.1 Mausereignisse Mausklick (Event „mousePressed“) Die Mauskoordinaten werden als Integer geschickt und können mit „getX()“ bzw. „getY()“ abgeholt werden. Sie liegen allerdings als Integer vor, müssen also für die Ausgabe in einem Label in einen String umgewandelt werden. Ob linke oder rechte Maustaste, erfahren wir mit „getButton()“. In der Klasse „MouseEvent“ sind einige Konstanten definiert, die wir dafür verwenden können (MouseEvent.BUTTON1 = linke Maustaste, MouseEvent.BUTTON3 = rechte Maustaste) private void plMainMousePressed(java.awt.event.MouseEvent evt) { int x = evt.getX(); // x-Koord als Integer int y = evt.getY(); // y-Koord als Integer String sx = String.valueOf(x); // x-Koord in String umwandeln String sy = String.valueOf(y); // y-Koord als String if (evt.getButton() == MouseEvent.BUTTON1) // linke („BUTTON1“) oder rechte („BUTTON3“) Maustaste? { lbInfo.setText("Maus links gedrückt an " + sx + "/" + sy); } else if(evt.getButton() == MouseEvent.BUTTON3) { lbInfo.setText("Maus rechts gedrückt an " + sx + "/" + sy); } } 2.1.2 Mausbewegung ohne gedrückter Maustaste (Event „mouseMoved“) Mauskoordinaten: evt.getX() bzw. evt.getY(): private void plMainMouseMoved(java.awt.event.MouseEvent evt) { lbInfo.setText("x: " + String.valueOf(evt.getX()) + " / y: " + String.valueOf(evt.getY())); } 2.1.3 Mausbewegung mit gedrückter Maustaste (Event „mouseDragged“) Mauskoordinaten: evt.getX() bzw. evt.getY(): private void plMainMouseDragged(java.awt.event.MouseEvent evt) { lbInfo.setText(String.valueOf(evt.getX()) + "/" + String.valueOf(evt.getY())); } 2.1.4 Maus wird in Komponente bewegt (Event „mouseEntered“) Ereognis wird ausgelöst, wenn die Maus sich von außerhalb (von anderer Komponente oder außerhalb des Fensters) über diese Komponente bewegt. Mauskoordinaten: evt.getX() bzw. evt.getY() private void plMainMouseEntered(java.awt.event.MouseEvent evt) { lbInfo2.setText("plMain wurde betreten"); -8} 2.1.5 Maus verlässt Komponente (Event „mouseExited“) private void plMainMouseExited(java.awt.event.MouseEvent evt) { lbInfo2.setText("plMain wurde verlassen"); } 2.2 Klick auf Buttons (Event „actionPerformed“) Alle Schalter (JButton, JToggleButton, ...) kennen das Ereignis „actionPerformed“. Es wird ausgelöst durch Klick auf den Button. Weil dieses Ereignis das Standardereignis eines Buttons ist (was will man sonst, als darauf klicken?) genügt ein Doppelklick auf den Button, um in den Eventhandler des „actionPerformed“ - Ereignises zu kommen: private void bNeuActionPerformed(java.awt.event.ActionEvent evt { lbInfo.setText("Button „Neu“ wurde angeklickt"); } Auch ComboBoxes verhalten sich so. 2.3 Tastaturereignisse Tastaturevents können nur Komponenten senden, die für die Tastatureingabe bereit sind, d.h. den „Eingabefokus“ besitzen. Standardmäßig sind das Textfelder, Comboboxes u.ä. Unsere Zeichenfläche („plMain“) ist aber eine Instanz der Klasse „JPanel“, die nicht für Tastatureingaben gedacht ist. Will man dennoch alle Tastendrücke abfangen (was in der Regel der Fall sein wird), muss man dem Hauptfenster selbst (mainFrame) den Eingabefokus zuweisen (im Konstruktor „public mainFrame“, also bevor es sichtbar wird): public mainFrame() { initComponents(); this.setFocusable(true); // damit Tastaturereignisse abgefangen werden können } Achtung: Textfelder, ComboBoxes etc. übernehmen automatisch den Eingabefokus, wenn sie ausgewählt werden, geben ihn aber nicht automatisch wieder her. Das müssen wir mit der Anweisung „requestFocus()“ selbst erledigen, sobald die Textkomponente ihr Ereignis abgearbeitet hat (Beispiel: in einer ComboBox „cbStrichstärke“ wurde ein Eintrag angeklickt): private void cbStrichstärkeActionPerformed(java.awt.event.ActionEvent evt) { ... // Klick in ComboBox wird ausgewertet und abgearbeitet ... this.requestFocus(); // sobald das Ereignis der ComboBox abgearbeitet ist, bekommt das Fenster wieder den Eingabefokus } 2.3.1 Druckbare Zeichen (Event „keyTyped“) evt.getKeyChar liefert das druckbare Zeichen und berücksichtigt dabei auch das gewählte Tastaturlayout (z.B. Englisch: Taste „Z“ = Buchstabe „Y“). Nicht druckbare Tasten wie z.B. „Entf“ oder die -9- Funktionstasten werden nicht gemeldet (dafür gibt´s „keyPressed“). Datentyp des gesendeten Zeichens = char („Character“), daher muss mit String.valueOf() in einen String umgewandelt werden: private void formKeyTyped(java.awt.event.KeyEvent evt) { char c = evt.getKeyChar(); // Unicode der gedrückten Taste (Datentyp char) lbInfo.setText("Taste " + String.valueOf(c) + " gedrückt"); // char in String umwandeln! } 2.3.2 Tastencode (Event „KeyPressed“) evt.getKeyCode() liefert nicht das druckbare Zeichen als char, sondern den Tastencode als Integer. Bei druckbaren Zeichen entspricht er dem Unicode (65 = z.B. „A“), berücksichtigt aber nicht Groß-/ Kleinschreibung. Verwendet wird „keyPressed“ normalerweise zur Abfrage von Befehlen (sofern sie nicht schon mit den Menüeinträgen definiert wurden), nicht für die Textausgabe (dafür gibt´s „keyTyped“). Umschalt-, Steuerung- und Alt-Taste erhält man über evt.isShiftDown(), evt.isControlDown() und evt.isAltDown(). Da man in der Regle eine große Menge Tastenkombinationen in seinem Programm vorgesehen hat, bietet sich eine Abfrage mit „switch()“ an. Für alle Tasten gibt es Konstanten in der Klasse „KeyEvent“. Sie beginnen alle mit „VK_“ (= „Virtual Key“): private void formKeyPressed(java.awt.event.KeyEvent evt) { int t = evt.getKeyCode(); // Code der gedrückten Taste in lokaler Hilfsvariable merken if(evt.isControlDown()) // Strg-Taste gedrückt? { switch (t) { case KeyEvent.VK_D: // Taste “D” + Strg-Taste gedrückt? { ... ; break; } // TasteAlt+ L case KeyEvent.VK_F1: // Strg + F1? { ... ; break; } // Funktionstaste 1 case KeyEvent.VK_DELETE: { ... ; break; } // Taste "Entf" case KeyEvent.VK_BACK_SPACE: { ... ; break; } // Taste Löschen (Backspace) } // switch keycode } // else: keine Ziffer } if(evt.isAltDown()) // Alt-Taste gedrückt? { ... } if(evt.isShiftDown()) // Umschalt-Taste gedrückt? - 10 { ... } } Will man wissen, ob eine Zifferntaste gedrückt wurde, bietet sich eine if-Abfrage mit dem logischen „UND“ - Operator („&&“) an (Achtung: „0“ befindet sich hinter „9“, hat daher einen höheren Tastencode!) if ((t >= KeyEvent.VK_1) && (t <= KeyEvent.VK_9)) // Ziffer (Code zwischen 1 und 0)? { lbInfo.setText("Ziffer mit dem Tastencode " + String.valueOf(t) + " gedrückt"); } // falls Ziffer 2.3.3 Sonderfall „paintComponent“ Damit Komponenten auf dem Bildschirm überhaupt sichtbar sind, müssen sie naturgemäß erst einmal gezeichnet werden. Daher gibt es für jede Komponente das Ereignis „PaintComponent“. Es wird ausgelöst, wenn ... 1. ... das Programm gestartet wird (die Komponenten zum ersten Mal sichtbar sein sollen) 2. ... das Fenster aus dem Bildschirm bewegt oder verkleinert oder durch ein anderes Fenster verdeckt und danach wieder zurückgebracht wurde (Komponenten müssen neu gezeichnet werden) Dies geschieht automatisch, denn jede Komponente weiß ja durch ihre Properties, wie sie aussieht (Hintergrundfarbe, Ränder, Beschriftung, etc.). Auch unser Panel „plMain“ zeichnet sich selbst (Hintergrundfarbe und Ränder), weiß aber natürlich nicht, was wir sonst damit vorhaben (ein Grafikprogramm wird Fotos anzeigen, eine Textverarbeitung formatierten Text, ein Spiel Animationen, ...). Dafür sind wir selbst verantwortlich und müssen deshalb das paintComponent-Ereignis des Panels abfangen. Leider findet sich aber in Netbeans kein entsprechender Eintrag in der Liste der „Events“. Zum paintComponentEreignis kommen wir nur auf einem Umweg: Achte daruf, dass unser „plMain“ (z.B. durch Klick ins Fenster) selektiert ist → im Properties-Fenster Klick auf „Code“ → Klick auf die drei Punkte neben „Custom Creation Code“. Es öffnet sich ein Fenster, in dem der von Netbeans erzeugt Code steht, mit dem das Panel erzeugt (instanziert) wurde: new javax.swing.JPanel() { public void paint(Graphics g) { super.paint(g); } }; Setze den Cursor hinter den Strichpunkt neben „super.paint(g);“ und drücke Enter, um eine neue Zeile einzufügen. Hier könnten wir nun die Anweisungen eingeben, mit denen unser Panel gefüllt werden soll (Bilder, Text, Animationen, ...), allerdings sollten diese Anweisungen grundsätzlich immer in eine - 11 - eigene Methode ausgelagert werden, da ansonsten die Abarbeitung der Ereigniswarteschlange durch Java (den „Event-Thread“) blockiert würde! Statt den Anweisungen geben wir also einen aussagekräftigen Namen für eine Methode ein (z.B. paintPlMain“), die wir an dieser Stelle aufrufen. Vergiss nicht den Parameter „g“ (= eine Instanz der Klasse „Graphics“, die alle Methoden enthält, die zum Zeichnen benötigt werden) mitzuschicken! new javax.swing.JPanel() { public void paint(Graphics g) { super.paint(g); paintPlMain(g); // Aufruf unserer eigenen Methode, die alle Anweisungen zum Neuzeichnen des Panles enthält. Parameter „g“ enthält Graphics - Objekt und darf nicht vergessen werden! } }; Wichtig ist, dass der Aufruf nach „super.paint(g)“ erfolgt, denn in „super.paint(g)“ wird das schon beschriebene automatische Neuzeichnen der Komponente durchgeführt (d.h. Hintergrundfarbe, Ränder, etc.). Schließe danach das Fenster mit Klick auf „OK“ und wechsle in die Codeansicht des Hauptfensters („mainFrame“). An beliebiger Stelle im äußersten Block des mainFrame können wir jetzt unsere Methode „paintPlMain“ deklarieren (z.B. gleich hinter dem Konstruktor des mainFrame): public class mainFrame extends javax.swing.JFrame { public mainFrame() { initComponents(); this.setFocusable(true); } private void paintPlMain(Graphics g) // paintComponent-Eventhandler des Panels plMain { } } Für alle Zeichenbefehle, die wir benötigen, verwenden wir den Parameter „g“, also die Instanz des Graphics-Objekts. Ein Bild würden wir z.B. mit „g.drawImage“ zeichnen, einen Text mit „g.drawString“, usw. 2.4 Timer-Events Um Animationen abspielen zu können (aber nicht nur dafür), benötigt man einen Timer, der regelmäßig meldet, dass ein gewünschtes Zeitintervall abgelaufen ist. Java besitzt zwar die Klasse „JTimer“, aber weil sie keine sichtbare Komponente ist, ist sie auch nicht im Fenster „Palette“ zu finden. Wir müssen per Hand eine Instanz der Klasse und den dazugehörenden Event-Listener erzeugen: an beliebiger Stelle im - 12 - Hauptfenster (im äußersten Block) eine Klasse mit beliebigem Namen deklarieren, die die Klausel implements ActionListener enthält (z.B. hinter dem Konstruktor des Hauptfensters): public class mainFrame extends javax.swing.JFrame { public mainFrame() // Konstruktor des Hauptfensters { initComponents(); } class TimerListener implements ActionListener // Listener für Timer ("TimerListener" = beliebiger Name) { @Override public void actionPerformed(ActionEvent evt) // ActionPerformed = Timerevent ausgelöst { ... // hier stehen die Anweisungen, die nach jedem Timer-Intervall ausgeführt werden sollen } } } Die Anweisungen, die nach jedem Timer-Intervall ausgeführt werden sollen, werden wir in die Methode „actionPerformed“ schreiben. Als Nächstes wird eine Instanz der Timer-Klasse erzeugt und in einer Variable gespeichert. Da der Timer während des gesamten Programmlaufs zur Verfügung stehen soll, dürfen wir keine lokale Variable verwenden, sondern deklarieren eine Variable im äußersten Block des Hauptfensters (eine solche Variable ist eigentlich keine Variable, sondern ein sog. „Feld“ der Fensterklasse): public class mainFrame extends javax.swing.JFrame { Timer myTimer; // im gesamten Programm gültige Variable („Feld“) für die Instanz der Klasse Timer deklarieren Wie üblich erzeugen wir die Instanz des Timers durch Aufruf von dessen Konstruktor („new Timer“) und speichern sie (genauer: deren Startadresse) im Feld „myTimer“. Der Konstruktor des Timers erwartet zwei Parameter: die Zeit in Millisekunden, die zwischen den einzelnen Timer-Events liegen soll die Instanz des Event-Listeners, in dem das Timer-Ereignis verarbeitet wird (die Listener-Klasse haben wir oben ( „TimerListener“) bereits angelegt). Wo erzeugt man die Timer-Instanz? Entweder im Konstruktor des Fensters (mainFrame) oder im äußersten Block zugleich mit der Deklariation: - 13 - Variante a) (im Konstruktor des Hauptfensters) public class mainFrame extends javax.swing.JFrame { Timer myTimer; // Feld für Instanz des Timers deklarieren public mainFrame() // Konstruktor des Fensters { initComponents(); TimerListener t = new TimerListener(); // Instanz des Listeners erzeugen myTimer = new Timer(30, t); // Timer erzeugen: Intervall in ms und Listener-Instanz übergeben } Variante b) (Deklaration + beide Instanzierungen in einer Zeile) Die kürzeste Möglichkeit deklariert und erzeugt alles auf einmal: public class mainFrame extends javax.swing.JFrame { Timer myTimer = new Timer(30,new TimerListener()); // Feld für Instanz des Timers deklarieren und gleichzeitig Instanz des Timers und des Listeners erzeugen public mainFrame() // Konstruktor des Fensters { initComponents(); } Ab jetzt können wir an beliebiger Stelle unseres Programms den Timer mit seiner Methode „start()“ ein- und mit „stop()“ ausschalten (myTimer.start() bzw. myTimer.stop()). Sobald er eingeschaltet wird (egal wo), wird im angegebenen Intervall (30 ms) das Ereignis „actionPerformed“ ausgelöst und die entsprechende Methode in unserer Listener-Klasse „TimerListener“ aufgerufen.