13.02.05 Besondere Schaltflächen

Butttons sind dafür gedacht, eine Aktion auszulösen, aber für Konfigurationszwecke sind sie wengier geeignet. Für diesen Fall wurden die Klassen JCheckBox und JRadioButton entwickelt. In diesem Kapitel werden Sie diese kennenlernen.

Die JCheckBox

Eine Checkbox ist eine Schaltfläche, die vom Nutzer selektiert oder deselektiert werden kann. Sie ist damit für optionale Einstellungen gedacht, wie zum Beispiel die Einstellung „Beim Schließen speichern“. Sie kann nur die Werte „selektiert“ (true) oder „nicht selektiert“ (false) vom Nutzer entgegennehmen, aber keinen Text oder Zahlen.

Die Verwendung der JCheckBox ist relativ simpel. Ein JCheckBox wird genau so instanziiert, wie ein JButton, also wahlweise mit Text oder Bild oder beidem. Drei Konstruktoren kommen noch hinzu, nämlich JCheckBox(String text, boolean selected), JCheckBox(Icon icon, boolean selected) und JCeckBox(String text, Icon icon, boolean selected), welche alle die Möglichkeit bieten, der CheckBox einen bestimmten Start-Wert zu geben. Wird ein Konstruktor ohne den Paramter boolean selected verwendet, ist die Box deselektiert, bis der Benutzer den Status selbst ändert.

Hier noch ein kleines Beispiel. Das Erstellen eines extra Fensters wurde weggelassen, da die Konfiguration eines JFrames schon aus den früheren Kapiteln bekannt sein sollte.

JCheckBox jCheckBox = new JCheckBox("Automatisches Speichern", true);

// Methoden wie get- und setText, Farben und ähnliches sind genau so wie bei den anderen Steuerelementen.

//Abfragen und Verändern des Statuses
boolean isSelected = jCheckBox.isSelected();
box.setSelected(false);

Der JCheckBox lassen sich genau so wie anderen Steuerelementen auch, ActionListener hinzufügen, hierzu lesen Sie bitte im Kapitel der 13.02.02 Der JButton nach. Der ActionListener wird auch aktiviert, wenn der Benutzer den Status der Box geändert hat, da er dabei ja auch auf das Steuerelement geklickt hat.

An dieser Stelle möchte ich Ihnen noch eine neuen Listener vorstellen, den ChangeListener, der auf Änderungen des Selektionszustandes eines Buttons reagiert. Genau genommen ist der ChangeListener eine Schnitstelle, die aber nur eine Methode stateChanged(...) besitzt, die aufgerufen wird, wenn sich der Status eines Buttons verändert hat.

Auch JButtons lassen sich selektieren, es gibt aber keinen visuellen Effekt, und standardmäßig wird ein JButton nicht beim einem Klick selektiert.

Der Unterschied zwischen dem ActionListener und dem ChangeListener ist, dass der ChangeListener auch aufgerufen wird, wenn der Status der Box softwareseitig mit setSelected(...) verändert wird. Dazu ein kleiner Beispielquelltext:

JCheckBox box = new JCheckBox();
box.addChangeListener(new ChangeListener() {

  public void stateChanged(ChangeEvent e) {
    System.out.println("Changed"); //Wird aufgerufen, sobald sich der Status irgendwie verändert.
  }
});
box.setSelected(true);
box.setSelected(true); //Es hat sich nichts verändert, also wird auch der ChangeListener nicht aktiviert

Der JRadioButton

Der RadioButton hat seinen Namen von alten Kassettenrekordern. Diese Geräte hatten mehrere Schalter. Betätigte man ein einen Schalter, deaktivierte sich ein eventuell zuvor aktivierter Schalter.
Ein RadioButton kennt also auch, wie eine CheckBox, nur selektiert und nicht selektiert. Der Unterschied besteht jedoch darin, dass RadioButtons sich oft nicht deselektieren lassen, sondern nur durch die Selektion eines anderen RadioButtons deselektiert werden. Wie bei einem alten Kasettenrekorder.

Die Handhabung des JRadioButtons ist nicht viel anders als die der JCheckBox, es wird allerdings eine weitere Klasse benötigt, die festlegt, welche JRadioButtons zu einer Gruppe zusammengefasst werden, und sich damit selektieren oder deselektieren. Die entsprechende Klasse heißt ButtonGroup, in die einfach alle Buttons, die zusammengehören, hineinkommen. Ich sagte hier extra Buttons, da eine ButtonGroup alle Arten von Buttons aufnehmen kann (genauer: nur die, die von AbstractButton erben). Die ButtonGroup kümmert sich darum, dass immer nur ein Button selektiert ist.

Hier ein kleiner Beispielquelltext:

import javax.swing.ButtonGroup;
import javax.swing.*;
JRadioButton note_1 = new JRadioButton("Note 1", true);
JRadioButton note_2 = new JRadioButton("Note 2", false);
JRadioButton note_3 = new JRadioButton("Note 3", false);
JRadioButton note_4 = new JRadioButton("Note 4", false);
JRadioButton note_5 = new JRadioButton("Note 5", false);
JRadioButton note_6 = new JRadioButton("Note 6", false);

ButtonGroup group = new ButtonGroup();
group.add(note_1);
group.add(note_2);
group.add(note_3);
group.add(note_4);
group.add(note_5);
group.add(note_6);

//Und nun nur noch die Buttons dem Frame, Dialog oder Panel hinzufügen

Über die Gruppe selbst lässt sich nicht erfragen, welcher Button gerade selektiert ist. Sie können nur mit getSelection() das Buttonmodell des aktivierten Buttons erfragen, aber nicht den Button selbst.
Ein Lösungsansatz ist, mit getElements() die enthaltenen Buttons zu durchlaufen, bis der selektierte kommt. Bei diesem Lösungsansatz wird die Methode JRadioButton.isSelected() angewandt:

Enumeration e = buttonGroup.elements();
JRadioButton selectedButton = null;
while(e.hasMoreElements() && selectedButton==null){
  JRadioButton button = (JRadioButton)e.nextElement();
  if(button.isSelected()){
    selectedButton  = button;
  }
}

Die beste und speicherfreundlichste Lösung ist allerdings, jedem Button ein changeListener zu geben, der prüft, ob der entsprechende Button selektiert ist und, wenn das der Fall ist, irgendwo speichert, welcher Button der selektierte ist. Somit können Sie schneller auf den selektierten Button zugreifen.

Der Haken an der Sache

Ein Besonderheit gibt es bei beiden in diesem Kapitel vorgestellten Steuerelemten. Die Icons, die über den Konstruktor oder über setIcon(Icon icon) hinzugefügt werden, ersetzen das Kästchen bzw. den Kreis sind somit als Icons für den Zustand „nicht selektiert“ zu verstehen. Diese Icons bleiben auch bestehen, wenn die Box selektiert wird. Man kann allerdings mit der Methode setSelectedIcon(Icon selectedIcon) ein Icon speziell für den Zustand „selektiert“ wählen. Dann wird zwischen den beiden Icons gewechselt, allerdings noch bevor sich der Status ändert, sondern schon, wenn sich die Maus über dem Element befindet, da in diesem Fall angedeutet wird, dass dieses Steuerelement klickbar ist.

Und weiter?

Auch im nächsten Kapitel geht es um Klicks von Benutzern, aber in einer anderen Form. Denn im nächsten Kapitel geht es um Menüs, genauer Programmmenüs und Kontextmenüs.

3 Replies to “13.02.05 Besondere Schaltflächen”

  1. Sebastian

    Hallo,

    @Abschnitt zu Radio-Buttons
    Ich glaube, die Methode um das Buttonmodell zu erfragen heißt getSelection() und nicht getSelected().

    Undeutlich -nicht falsch- ist auch die Erklärung mit getElements() im nächsten Satz. Ich glaube, es wäre hilfreich, hier auf die Methode isSelected() hinzuweisen.

    MfG Sebastian

  2. Fabian Feitsch

    Hi,

    erst mal danke, dass du unser Buch so aufmerksam liest und uns auf die Fehler hinweist!

    Ich habe ein Code-Beispiel eingefügt, wie es mit isSelected() funktionieren könnte. Hoffe, da hat sich nicht auch wieder der Fehlerteufel eingeschlichen 😉 .

    Viele Grüße,
    Fabian

  3. Helmut

    Hallo Herr Feitsch,

    so ein prima Blog Buch verdient, daß auch kleine Verwechsler ausgebessert werden.
    ButtonGroup ist ebenfalls eine Klasse aus javax.swing.
    Deshalb bitte im Beispieltext.

    Mit freundlichen Grüßen,
    Helmut

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.