Swing: Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
 
(20 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 9: Zeile 9:
Deswegen werden hier nur wenige wesentliche Elemente von Swing benannt.
Deswegen werden hier nur wenige wesentliche Elemente von Swing benannt.


Swing lässt sich am besten mit einem geeigneten Plugin entwickeln, z.B. dem [http://download.eclipse.org/windowbuilder/WB/integration/4.4/ '''WindowBuilder'''] für Eclipse.
'''Swing sollte man AUF JEDEN FALL mit einem geeigneten Plugin entwickeln, z.B. dem [http://download.eclipse.org/windowbuilder/WB/integration/4.4/ '''WindowBuilder'''] für Eclipse.'''<br/>
Damit hat man dann eine grafische Entwicklungsoberfläche, in der man die Swing-Elemente "zusammenklicken" kann.


=Container=
=Container=
Zeile 16: Zeile 17:
Man kann auch Container in andere Container packen (Ausnahme: JFrame).
Man kann auch Container in andere Container packen (Ausnahme: JFrame).


* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_003.htm#mj6ee2c84afdbd3308eae62e58c0779add JFrame]''': Ein Fenster, das oben eine blaue Leiste hat für die Überschrift und das man schließen kann. Einen JFrame braucht man immer, weil JFrames selbstständig auf dem Bildschirm erscheinen können; alle anderen Elemente müssen in einen JFrame reingepackt werden.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_003.htm#mj6ee2c84afdbd3308eae62e58c0779add JFrame]</code>''': Ein Fenster, das oben eine blaue Leiste hat für die Überschrift und das man schließen kann. Einen <code>JFrame</code> braucht man immer, weil JFrames selbstständig auf dem Bildschirm erscheinen können; alle anderen Elemente müssen in einen <code>JFrame</code> reingepackt werden.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_010.htm#mj5c3ca432ef021d9c5cd26a5441702e99 JPanel]''': Ein Container, der eigentlich unsichtbar ist; JPanel dienen dazu, andere Elemente zusammenzufassen.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_010.htm#mj5c3ca432ef021d9c5cd26a5441702e99 JPanel]</code>''': Ein Container, der eigentlich unsichtbar ist; <code>JPanel</code> dienen dazu, andere Elemente zusammenzufassen.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_010.htm#mj66f472599b8b53fe93ea7adde5f179c3 JScrollPane]''': Ein Container, der Scrollbars bereitstellt, wenn der Inhalt zu groß ist, um ihn ganz im Container darzustellen.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_010.htm#mj66f472599b8b53fe93ea7adde5f179c3 JScrollPane]</code>''': Ein Container, der Scrollbars bereitstellt, wenn der Inhalt zu groß ist, um ihn ganz im Container darzustellen.


==wichtige Methoden==
==wichtige Methoden==
* '''<code>add(...)''': fügt ein Element hinzu.
* '''<code>add(...)</code>''': fügt ein Element hinzu.
* '''<code>remove(...)''': entfernt ein Element.
* '''<code>remove(...)</code>''': entfernt ein Element.
* '''<code>setSize(int width, int height)'''
* '''<code>removeAll()</code>''': entfernt alle Elemente.
* '''<code>revalidate()''' : wenn man dem Container ein neues Element hinzugefügt hat, dann muss man diese Methode aufrufen, damit der Container seine Größe anpasst. Am besten ruft man direkt danach repaint() (s.u.) auf.
* '''<code>setSize(int width, int height)</code>'''
* '''<code>repaint()''' : sorgt dafür, dass der Container neu gezeichnet wird.  
* '''<code>revalidate()</code>''' : wenn man dem Container ein neues Element hinzugefügt hat, dann muss man diese Methode aufrufen, damit der Container seine Größe anpasst. Am besten ruft man direkt danach <code>repaint()</code> (s.u.) auf.
* '''<code>setVisible(boolean pVisible)'''
* '''<code>repaint()</code>''' : sorgt dafür, dass der Container neu gezeichnet wird.  
* '''<code>setLayout(...)'''; z.B. <code>setLayout(new BorderLayout());
* '''<code>setVisible(boolean pVisible)</code>'''
* ''für JFrame:'' '''<code>getContentPane()''': gibt den eigentlichen Inhalt des JFrame zurück.
* '''<code>setLayout(...)</code>'''; z.B. <code>setLayout(new BorderLayout());</code>
* ''für JFrame:'' '''<code>setContentPane(...)''': Platziert ein Element im JFrame. <u>Vorsicht: add(...) funktioniert für JFrame nicht!</u> ''(Das ist nicht grade intuitiv, ist aber leider so.)''
* ''für JFrame:'' '''<code>getContentPane()</code>''': gibt den eigentlichen Inhalt des <code>JFrame</code> zurück.
* ''für JFrame:'' '''<code>setContentPane(...)</code>''': Platziert ein Element im <code>JFrame</code>. <u>Vorsicht: <code>add(...)</code> funktioniert für <code>JFrame</code> nicht!</u> ''(Das ist nicht grade intuitiv, ist aber leider so.)''


=Layout=
=Layout=
Jeder Container braucht ein Layout, in dem festgelegt wird, wie die Elemente im Container angeordnet werden.
Jeder Container braucht ein Layout, in dem festgelegt wird, wie die Elemente im Container angeordnet werden.
* '''<code>BorderLayout''': Das BorderLayout legt fünf Regionen fest: <code>BorderLayout.CENTER, <code>BorderLayout.NORTH, <code>BorderLayout.SOUTH, <code>BorderLayout.WEST, <code>BorderLayout.EAST. In jeder der fünf Regionen kann nur ein Element platziert werden; das kann aber auch ein JPanel sein.
* '''<code>BorderLayout</code>''': Das <code>BorderLayout</code> legt fünf Regionen fest: <code>BorderLayout.CENTER</code>, <code>BorderLayout.NORTH</code>, <code>BorderLayout.SOUTH</code>, <code>BorderLayout.WEST</code>, <code>BorderLayout.EAST</code>. In jeder der fünf Regionen kann nur ein Element platziert werden; das kann aber auch ein <code>JPanel</code> oder ein andere Container sein.
* '''<code>AbsoluteLayout''': Dieses Layout ermöglicht es einem, die Elemente an Positionen zu platzieren, die man durch Koordinaten angibt (bzw. mit dem WindowBuilder zieht man die Komponenten an die passende Stelle.) Das ist praktisch, wenn man sicher weiß, dass die Elemente eine feste Größe haben.
* '''<code>AbsoluteLayout</code>''': Dieses Layout ermöglicht es einem, die Elemente an Positionen zu platzieren, die man durch Koordinaten angibt (bzw. mit dem WindowBuilder zieht man die Komponenten an die passende Stelle.) Das ist praktisch, wenn man sicher weiß, dass die Elemente eine feste Größe haben.
* '''<code>BoxLayout''': BoxLayout ermöglicht, mehrere Elemente nebeneinander (<code>X_AXIS) oder untereinander (<code>Y_AXIS) zu platzieren.
* '''<code>BoxLayout</code>''': <code>BoxLayout</code> ermöglicht, mehrere Elemente nebeneinander (<code>X_AXIS</code>) oder untereinander (<code>Y_AXIS</code>) zu platzieren.


=Components=
=Components=
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_004.htm#mj60ce3a2ffc3e9bb53ce771e1be6ab815 JLabel]''': einzeilige Schrift; nicht editierbar.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_004.htm#mj60ce3a2ffc3e9bb53ce771e1be6ab815 JLabel]</code>''': einzeilige Schrift; nicht editierbar.
* '''<code>JTextField''': einzeiliges Textfeld; editierbar.
* '''<code>JTextField</code>''': einzeiliges Textfeld; editierbar.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_018.htm#mjcf36ecd72996f6d1103fe68e3b029b51 JTextArea]''': mehrzeiliges Textfeld; editierbar. Um Text in mehreren Zeilen anzuzeigen, muss man als Zeilenumbruch "\n" einbauen.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_018.htm#mjcf36ecd72996f6d1103fe68e3b029b51 JTextArea]</code>''': mehrzeiliges Textfeld; editierbar. Um Text in mehreren Zeilen anzuzeigen, muss man als Zeilenumbruch "\n" einbauen.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_007.htm#mj9241ccf572ee0550ef5d590db21dff5f JButton]''': ein Button. Um das Klicken abzufangen, muss an den Button ein <code>ActionListener angehängt werden; das macht man am besten mit dem WindowBuilder.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_007.htm#mj9241ccf572ee0550ef5d590db21dff5f JButton]</code>''': ein Button. Um das Klicken abzufangen, muss an den Button ein <code>ActionListener</code> angehängt werden; das macht man am besten mit dem WindowBuilder.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_013.htm#mj2721ba12d1970cb13863fdd31b8c8646 JCheckbox]''' und '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_013.htm#mj43810aa1240cd64b6fb6198331e55f04 JRadioButton]''': wichtig, um von vielen Möglichkeiten <u>mehrere</u> auszuwählen. Bei der <code>JCheckbox kann man in der Regel mehrere anklicken; den <code>JRadioButton benutzt man, wenn man von vielen Möglichkeiten nur <u>eine</u> wählen darf. Dafür müssen die <code>JRadioButtons zu einer '''<code>ButtonGroup''' hinzugefügt werden.
* '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_013.htm#mj2721ba12d1970cb13863fdd31b8c8646 JCheckbox]</code>''' und '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_013.htm#mj43810aa1240cd64b6fb6198331e55f04 JRadioButton]</code>''': wichtig, um von vielen Möglichkeiten <u>mehrere</u> auszuwählen. Bei der <code>JCheckbox</code> kann man in der Regel mehrere anklicken; den <code>JRadioButton</code> benutzt man, wenn man von vielen Möglichkeiten nur <u>eine</u> wählen darf. Dafür müssen die <code>JRadioButtons</code> zu einer '''<code>ButtonGroup</code>''' hinzugefügt werden.


==wichtige Methoden==
==wichtige Methoden==
* <code>setText(String pText)
* <code>setText(String pText)</code>
* <code>getText()
* <code>getText()</code>
* <code>isSelected()  ''nur für JCheckbox und JRadioButton''
* <code>isSelected()</code>   ''nur für JCheckbox und JRadioButton''
 
=Eine Benutzeroberfläche sichtbar machen=
"Selbstständig lebensfähig" ist von den genannten Klassen nur die Klasse <code>JFrame</code>.
 
D.h. wenn man eine Oberfläche sichtbar machen will, dann muss man am besten alles in einen <code>JFrame</code> packen.
Dafür bietet sich folgendes Verfahren an:
* Das <code>JFrame</code>-Objekt enthält als Attribut ein Objekt, das von <code>JPanel</code> <u>erbt</u>.
* Dieses Objekt wird dem <code>JFrame</code> hinzugefügt.
** WICHTIG: dafür muss <u>'''<code>this.getContentPane().add(...)</code>'''</u> aufgerufen werden!!!
 
'''Beispiel:'''
 
<code>
import javax.swing.JFrame;
'''public class MainFrame extends JFrame{'''
  '''private SimplePanel simplePanel;'''
 
  '''public MainFrame() {'''
      //simplePanel erzeugen
      '''simplePanel = new SimplePanel();'''
      //simplePanel hinzufuegen
      '''this.<u>getContentPane().add(simplePanel);</u>'''
      // mit pack kann man die Groesse des JFrame auf das notwendige Mass bringen
      this.pack();
      // sichtbar machen.
      <u>this.setVisible(true);</u>
  }
     
  public static void main(String[] args) {
      MainFrame sf = new MainFrame();
  }
}
</code>
 
''Die Klasse <code>SimplePanel</code> ist hier nur für Demo-Zwecke aufgeführt. ''
<code>
import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
'''public class SimplePanel <u>extends JPanel</u> {'''
    private JLabel dasLabel;
 
    public SimplePanel(){
        this.setLayout(new BorderLayout());
        dasLabel = new JLabel("test: dasLabel");
        this.add(dasLabel, BorderLayout.CENTER);
    }
}
</code>
 
=Events und Listener=
Events werden ausgelöst, wenn in der grafischen Oberfläche eine Eingabe o.ä. passiert. Das "klassische" Event ist das Klicken eines <code>JButton</code>.
 
Um auf ein Event zu reagieren, muss man an die entsprechende Komponente (z.B. den <code>JButton</code>) einen '''<code>[http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_19_006.htm#mj6aa67dbe1c77bcf0a760b610ea19d50c Listener]</code>''' hinzugefügt; dieser "hört zu", ob ein Event ausgelöst wird.
 
Standard-Beispiel für einen <code>JButton</code>:
* Hier wird ein <code>ActionListener</code> hinzugefügt;
* dieser hat die Methode <code>public void actionPerformed(ActionEvent e)</code>.
* diese Methode wird aufgerufen, wenn der <code>JButton</code> geklickt wird.
* D.h. in die Methode <code>public void actionPerformed(ActionEvent e)</code> schreibt man rein, was passieren soll, wenn der <code>JButton</code> geklickt wird!
 
Beispiel:
 
<code>
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class ButtonFrame extends JFrame{
 
  JButton derButton;
 
  public ButtonFrame() {
      derButton = new JButton("groesser machen");
 
      // dem JButton einen ActionListener hinzufuegen
      // (der ActionListener ist in diesem Fall anonym)
      <u>'''derButton.addActionListener(new ActionListener(){'''</u>
 
            // diese Methode wird aufgerufen, wenn ein ActionEvent fuer den Button ausgeloest wurde.
            <u>'''public void actionPerformed(ActionEvent e) {'''</u>
              // hier jetzt die Methode aufrufen, die dann ausgefuehrt werden soll.
              vergroessern();
            <u>'''}'''</u>
      <u>'''});'''</u>
 
      this.getContentPane().add(derButton);
      this.pack();
      this.setVisible(true);
  }
  // diese Methode soll ausgefuehrt werden, wenn der Button geklickt wird.
  '''<u>private void vergroessern(){</u>'''
      this.setSize(this.getWidth()+10, this.getHeight()+10);
  }
     
  public static void main(String[] args) {
      ButtonFrame bf = new ButtonFrame();
  }
}
</code>


=JOptionPane=
=JOptionPane=
'''<code>[http://openbook.rheinwerk-verlag.de/javainsel/javainsel_11_007.html#dodtpf70d8a68-8fa2-453d-8865-013ff8edd377 JOptionPane]''' dient dazu, kleine Fenster aufzumachen, z.B. um eine Bestätigung oder Eingabe vom Nutzer abzufragen. Die Abarbeitung der aufrufenden Methode wartet so lange, bis der Nutzer das Fenster durch OK oder Abbrechen zugemacht hat.
'''<code>[http://openbook.rheinwerk-verlag.de/javainsel/javainsel_11_007.html#dodtpf70d8a68-8fa2-453d-8865-013ff8edd377 JOptionPane]</code>''' dient dazu, kleine Fenster aufzumachen, z.B. um eine Bestätigung oder Eingabe vom Nutzer abzufragen. Die Abarbeitung der aufrufenden Methode wartet so lange, bis der Nutzer das Fenster durch OK oder Abbrechen zugemacht hat.


==wichtige Methoden==
==wichtige Methoden==
* '''<code>JOptionPane.showInputDialog(String pFrage)''': Fragt eine Texteingabe vom Nutzer ab. Gibt einen String zurück.
* '''<code>JOptionPane.showInputDialog(String pFrage)</code>''': Fragt eine Texteingabe vom Nutzer ab. Gibt einen <code>String</code> zurück.
* '''<code>JOptionPane.showMessageDialog(Component parentComponent, String pMessage)''': Informiert den Nutzer über irgendetwas. <code>parentComponent kann <code>null sein. Gibt <code>void</code> zurück.
* '''<code>JOptionPane.showMessageDialog(Component parentComponent, String pMessage)</code>''': Informiert den Nutzer über irgendetwas. <code>parentComponent</code> kann <code>null</code> sein. Gibt <code>void</code> zurück.
* '''<code>JOptionPane.showConfirmDialog(Component parentComponent, String pFrage)''': Fragt nach einer Bestätigung (Ja, Nein, Abbrechen). <code>parentComponent kann <code>null sein. Gibt <code>int</code> zurück. Die möglichen Rückgaben sind:
* '''<code>JOptionPane.showConfirmDialog(Component parentComponent, String pFrage)</code>''': Fragt nach einer Bestätigung (Ja, Nein, Abbrechen). <code>parentComponent</code> kann <code>null</code> sein. Gibt <code>int</code> zurück. Die möglichen Rückgaben sind:
** <code>JOptionPane.YES_OPTION
** <code>JOptionPane.YES_OPTION</code>
** <code>JOptionPane.NO_OPTION
** <code>JOptionPane.NO_OPTION</code>
** <code>JOptionPane.CANCEL_OPTION
** <code>JOptionPane.CANCEL_OPTION</code>
** Die Rückgaben überprüft man z.B. so:
** Die Rückgaben überprüft man z.B. so:
<code>
<code>
  int gewaehlt = JOptionPane.showConfirmDialog(null, "Nochmal?");
  int gewaehlt = JOptionPane.showConfirmDialog(null, "Nochmal?");
  if(gewaehlt == JOptionPane.YES_OPTION)
  if(gewaehlt == JOptionPane.YES_OPTION)
Zeile 68: Zeile 177:
  else
  else
  {...}
  {...}
</code>
</code>

Aktuelle Version vom 23. Januar 2022, 18:19 Uhr


Swing ist eine Java-Bibliothek, mit der man Benutzeroberflächen bauen kann.

Es lohnt sich nicht mehr zu tief in Swing einzusteigen, weil es ab Java 1.8 die neue Bibliothek JavaFX gibt, die mehr Funktionalität hat (z.B. Integration von Stylesheets) und sich u.a. auch für die Entwicklung von Benutzeroberflächen für Apps eignet.

Allerdings ist Swing immer noch geeignet, wenn man mal "ganz schnell" eine grafische Oberfläche für ein Programm braucht!

Deswegen werden hier nur wenige wesentliche Elemente von Swing benannt.

Swing sollte man AUF JEDEN FALL mit einem geeigneten Plugin entwickeln, z.B. dem WindowBuilder für Eclipse.
Damit hat man dann eine grafische Entwicklungsoberfläche, in der man die Swing-Elemente "zusammenklicken" kann.

Container

In Container kann man andere Oberflächenelemente reinpacken. Sie brauchen deswegen ein definiertes Layout.

Man kann auch Container in andere Container packen (Ausnahme: JFrame).

  • JFrame: Ein Fenster, das oben eine blaue Leiste hat für die Überschrift und das man schließen kann. Einen JFrame braucht man immer, weil JFrames selbstständig auf dem Bildschirm erscheinen können; alle anderen Elemente müssen in einen JFrame reingepackt werden.
  • JPanel: Ein Container, der eigentlich unsichtbar ist; JPanel dienen dazu, andere Elemente zusammenzufassen.
  • JScrollPane: Ein Container, der Scrollbars bereitstellt, wenn der Inhalt zu groß ist, um ihn ganz im Container darzustellen.

wichtige Methoden

  • add(...): fügt ein Element hinzu.
  • remove(...): entfernt ein Element.
  • removeAll(): entfernt alle Elemente.
  • setSize(int width, int height)
  • revalidate() : wenn man dem Container ein neues Element hinzugefügt hat, dann muss man diese Methode aufrufen, damit der Container seine Größe anpasst. Am besten ruft man direkt danach repaint() (s.u.) auf.
  • repaint() : sorgt dafür, dass der Container neu gezeichnet wird.
  • setVisible(boolean pVisible)
  • setLayout(...); z.B. setLayout(new BorderLayout());
  • für JFrame: getContentPane(): gibt den eigentlichen Inhalt des JFrame zurück.
  • für JFrame: setContentPane(...): Platziert ein Element im JFrame. Vorsicht: add(...) funktioniert für JFrame nicht! (Das ist nicht grade intuitiv, ist aber leider so.)

Layout

Jeder Container braucht ein Layout, in dem festgelegt wird, wie die Elemente im Container angeordnet werden.

  • BorderLayout: Das BorderLayout legt fünf Regionen fest: BorderLayout.CENTER, BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.EAST. In jeder der fünf Regionen kann nur ein Element platziert werden; das kann aber auch ein JPanel oder ein andere Container sein.
  • AbsoluteLayout: Dieses Layout ermöglicht es einem, die Elemente an Positionen zu platzieren, die man durch Koordinaten angibt (bzw. mit dem WindowBuilder zieht man die Komponenten an die passende Stelle.) Das ist praktisch, wenn man sicher weiß, dass die Elemente eine feste Größe haben.
  • BoxLayout: BoxLayout ermöglicht, mehrere Elemente nebeneinander (X_AXIS) oder untereinander (Y_AXIS) zu platzieren.

Components

  • JLabel: einzeilige Schrift; nicht editierbar.
  • JTextField: einzeiliges Textfeld; editierbar.
  • JTextArea: mehrzeiliges Textfeld; editierbar. Um Text in mehreren Zeilen anzuzeigen, muss man als Zeilenumbruch "\n" einbauen.
  • JButton: ein Button. Um das Klicken abzufangen, muss an den Button ein ActionListener angehängt werden; das macht man am besten mit dem WindowBuilder.
  • JCheckbox und JRadioButton: wichtig, um von vielen Möglichkeiten mehrere auszuwählen. Bei der JCheckbox kann man in der Regel mehrere anklicken; den JRadioButton benutzt man, wenn man von vielen Möglichkeiten nur eine wählen darf. Dafür müssen die JRadioButtons zu einer ButtonGroup hinzugefügt werden.

wichtige Methoden

  • setText(String pText)
  • getText()
  • isSelected() nur für JCheckbox und JRadioButton

Eine Benutzeroberfläche sichtbar machen

"Selbstständig lebensfähig" ist von den genannten Klassen nur die Klasse JFrame.

D.h. wenn man eine Oberfläche sichtbar machen will, dann muss man am besten alles in einen JFrame packen. Dafür bietet sich folgendes Verfahren an:

  • Das JFrame-Objekt enthält als Attribut ein Objekt, das von JPanel erbt.
  • Dieses Objekt wird dem JFrame hinzugefügt.
    • WICHTIG: dafür muss this.getContentPane().add(...) aufgerufen werden!!!

Beispiel:


import javax.swing.JFrame;

public class MainFrame extends JFrame{

  private SimplePanel simplePanel;
  
  public MainFrame() {
      //simplePanel erzeugen
      simplePanel = new SimplePanel();
      //simplePanel hinzufuegen
      this.getContentPane().add(simplePanel);
      // mit pack kann man die Groesse des JFrame auf das notwendige Mass bringen
      this.pack();
      // sichtbar machen.
      this.setVisible(true);
  }
     
  public static void main(String[] args) {
      MainFrame sf = new MainFrame();
  }
}

Die Klasse SimplePanel ist hier nur für Demo-Zwecke aufgeführt.


import java.awt.BorderLayout;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class SimplePanel extends JPanel {
   private JLabel dasLabel;
  
   public SimplePanel(){
       this.setLayout(new BorderLayout());
       dasLabel = new JLabel("test: dasLabel");
       this.add(dasLabel, BorderLayout.CENTER);
   }
}

Events und Listener

Events werden ausgelöst, wenn in der grafischen Oberfläche eine Eingabe o.ä. passiert. Das "klassische" Event ist das Klicken eines JButton.

Um auf ein Event zu reagieren, muss man an die entsprechende Komponente (z.B. den JButton) einen Listener hinzugefügt; dieser "hört zu", ob ein Event ausgelöst wird.

Standard-Beispiel für einen JButton:

  • Hier wird ein ActionListener hinzugefügt;
  • dieser hat die Methode public void actionPerformed(ActionEvent e).
  • diese Methode wird aufgerufen, wenn der JButton geklickt wird.
  • D.h. in die Methode public void actionPerformed(ActionEvent e) schreibt man rein, was passieren soll, wenn der JButton geklickt wird!

Beispiel:


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ButtonFrame extends JFrame{
 
  JButton derButton;
  
  public ButtonFrame() {
      derButton = new JButton("groesser machen");
 
      // dem JButton einen ActionListener hinzufuegen
      // (der ActionListener ist in diesem Fall anonym)
      derButton.addActionListener(new ActionListener(){
 
           // diese Methode wird aufgerufen, wenn ein ActionEvent fuer den Button ausgeloest wurde.
           public void actionPerformed(ActionEvent e) {
              // hier jetzt die Methode aufrufen, die dann ausgefuehrt werden soll.
              vergroessern();
           }
      });
 
      this.getContentPane().add(derButton);
      this.pack();
      this.setVisible(true);
  }

  // diese Methode soll ausgefuehrt werden, wenn der Button geklickt wird.
  private void vergroessern(){
      this.setSize(this.getWidth()+10, this.getHeight()+10);
  }
     
  public static void main(String[] args) {
      ButtonFrame bf = new ButtonFrame();
  }
}

JOptionPane

JOptionPane dient dazu, kleine Fenster aufzumachen, z.B. um eine Bestätigung oder Eingabe vom Nutzer abzufragen. Die Abarbeitung der aufrufenden Methode wartet so lange, bis der Nutzer das Fenster durch OK oder Abbrechen zugemacht hat.

wichtige Methoden

  • JOptionPane.showInputDialog(String pFrage): Fragt eine Texteingabe vom Nutzer ab. Gibt einen String zurück.
  • JOptionPane.showMessageDialog(Component parentComponent, String pMessage): Informiert den Nutzer über irgendetwas. parentComponent kann null sein. Gibt void zurück.
  • JOptionPane.showConfirmDialog(Component parentComponent, String pFrage): Fragt nach einer Bestätigung (Ja, Nein, Abbrechen). parentComponent kann null sein. Gibt int zurück. Die möglichen Rückgaben sind:
    • JOptionPane.YES_OPTION
    • JOptionPane.NO_OPTION
    • JOptionPane.CANCEL_OPTION
    • Die Rückgaben überprüft man z.B. so:

int gewaehlt = JOptionPane.showConfirmDialog(null, "Nochmal?");
if(gewaehlt == JOptionPane.YES_OPTION)
{...}
else if (gewaehlt == JOptionPane.NO_OPTION)
{...}
else
{...}