© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
JRadioButton

 

 

Figur 1:
JRadioButtons placering i klasse-hierarkiet
Betragt følgende vindue:
Figur 2:
Tre RadioButtons i et vindue
Dette vindue laves med følgende program:
Source 1:
Tre RadioButtons i frame
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class RadioButtonFrame extends JFrame {
  private JRadioButton radio1, radio2, radio3;
  
  public RadioButtonFrame( String titel ) {
    super( titel );
    
    getContentPane().setLayout( new FlowLayout() );
    
    radio1 = new JRadioButton( "Tuner" );
    getContentPane().add( radio1 );
    
    radio2 = new JRadioButton( "CD" );
    getContentPane().add( radio2 );
    
    radio3 = new JRadioButton( "AUX" );
    getContentPane().add( radio3 );
    
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    
    pack();
    setVisible( true );
  }
}
Prøv:
Kør eksemplet - og vælg nogle af knapperne!
Hvis man prøver ovenstående program, vil knapperne blot virke som så mange andre knapper. Det eneste specielle ved dem er at de er runde, ellers ligner de CheckBox'es.
Det interessante ved instanser af JRadioButton er at de kan samles i en gruppe, hvoraf kun en kan være valgt. Eksemplet med Tuner (radio), CD og Aux (auxiliary) er taget fra et musikanlæg, hvor kun en af de tre lydkilder kan være valgt.
For at opnå denne indbyrdes udelukkelse, hvor kun en af dem kan være valgt, skal man bruge en instans af ButtonGroup. De tre knapper meldes til instanser af ButtonGroup, og den administrerer den gensidige udelukkelse.
Man tilmelder knapperne med add-metoden som for enhver anden container.
Vi vil udbygge vores eksempel med en sådan ButtonGroup, samt initialisere ved at vælge én af knapperne.
Source 2:
Tre RadioButtons i ButtonGroup
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class RadioButtonFrame extends JFrame {
  
  private JRadioButton radio1, radio2, radio3;
  
  public RadioButtonFrame( String titel ) {
    super( titel );
    
    getContentPane().setLayout( new FlowLayout() );
    
    ButtonGroup gruppen = new ButtonGroup();
    
    radio1 = new JRadioButton( "Tuner", true );
    gruppen.add( radio1 );
    getContentPane().add( radio1 );
    
    radio2 = new JRadioButton( "CD" );
    gruppen.add( radio2 );
    getContentPane().add( radio2 );
    
    radio3 = new JRadioButton( "AUX" );
    gruppen.add( radio3 );
    getContentPane().add( radio3 );
    
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    
    pack();
    setVisible( true );
  }
}
Prøv:
Kør eksemplet - og vælg nogle af knapperne!

Man ser her at de tre JRadioButtons add'es til gruppen som vi ikke bevarer en refrence til, da vi aldrig får brug for at arbejde med den igen.

Man ser også, at den første radiobutton vælges ved at anvende en anden konstruktor. Lad os se hvilke konstruktorer der er.

 

1. Konstruktorer

JRadioButton har følgende konstruktorer:
JRadioButton()
JRadioButton( Icon image )
JRadioButton( Icon image, boolean selected )
JRadioButton( String text )
JRadioButton( String text, boolean selected )
JRadioButton( String text, Icon image )
JRadioButton( String text, Icon image, boolean selected )
Disse konstruktorer giver mulighed for at anvende alle kombinationsmuligheder for de tre parametre man kan bruge ved instantieringen.
Parameteren selected angiver om knappen er valgt fra starten - default er false.
Der kan, som for JLabel, anvendes et icon. Følgende er et eksempel:
Figur 3:
JRadioButton med icon
Iconet træder i stedet for angivelsen af, om knappen er valgt eller ej, og det er dermed ikke længere muligt at se dette.

 

2. Event-håndtering

Det gør ikke den store forskel om man tilmelder sig en JRadioButton som ActionListener eller ItemListener. Der er dog den forskel, at man som ActionListener også modtager events nå der trykkes på en radiobutton, der allerede er valgt. Når den er i en gruppe, vil dette ikke ændre dens tilstand, og event'en er i virkeligheden ligegyldig.
Vi vil derfor demonstrere hvordan vi kan modtage ItemEvents fra vores tre radiobuttons fra før.
Source 3:
Tre RadioButtons i ButtonGroup
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

class RadioButtonFrame extends JFrame implements ItemListener {
  
  private JRadioButton radio1, radio2, radio3;
  
  public RadioButtonFrame( String titel ) {
    super( titel );
    
    getContentPane().setLayout( new FlowLayout() );
    
    ButtonGroup gruppen = new ButtonGroup();
    
    radio1 = new JRadioButton( "Tuner", true );
    radio1.addItemListener( this );
    gruppen.add( radio1 );
    getContentPane().add( radio1 );
    
    radio2 = new JRadioButton( "CD" );
    radio2.addItemListener( this );
    gruppen.add( radio2 );
    getContentPane().add( radio2 );
    
    radio3 = new JRadioButton( "AUX" );
    radio3.addItemListener( this );
    gruppen.add( radio3 );
    getContentPane().add( radio3 );
    
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    
    pack();
    setVisible( true );
  }

  public void itemStateChanged( ItemEvent e ) {
    Object source = e.getSource();

    if ( source == radio1 )
      System.out.println( "Tuner" );
    else if ( source == radio2 )
      System.out.println( "CD" );
    else if ( source == radio3 )
      System.out.println( "AUX" );
  }
}
Som enhver ItemListener skal vi implementere metoden:
void itemStateChanged( ItemEvent e )
I forbindelse med denne implementation identificerer vi event'en ophav ved at gemme referencer til de tre radiobuttons som instansvariable.
Man bemærker ligeldes at vi add'er os (framen) til alle tre radiobuttons.
Prøv:
Kør eksemplet - og tryk på nogle af knapperne!
Når man kører eksemplet bemærker man, at der sendes to events hver gang vi vælger en ny knap. Først kommer der en event fra den knap, som ikke længere er valgt; hvor efter der kommer en event fra den knap der nu er valgt.
Det giver mulighed for at knytte en handling til hver af disse begivenheder, og ikke kun til den sidste. Det betyder dog, at man skal være i stand til at skelne de to events fra hinanden. Det gøres vha. metoden
void isSelected()
på den JRadioButton der sendte event'en.
Vi kan udbygge itemStateChanged med en anvendelse af denne metode:
Source 4:
Tre RadioButtons i ButtonGroup
public void itemStateChanged( ItemEvent e ) {
  Object source = e.getSource();

  if ( source == radio1 )
    System.out.println( "Tuner: " + radio1.isSelected() );
  else if ( source == radio2 )
    System.out.println( "CD: " + radio2.isSelected() );
  else if ( source == radio3 )
    System.out.println( "AUX: " + radio3.isSelected() );
}

 

3. JToggleButton

Figur 4:
JToggleButtons placering i klasse-hierarkiet
JToggleButton er superklasse til JCheckBox og JRadioButton. Den er ikke abstrakt og man kan derfor lave instanser af den.
Betragt følgende vindue:
Figur 5:
To JToggle-Buttons i et vindue
Her har vi to instanser af JToggleButton. Den til højre er valgt, i modsætning til den til venstre. JToggleButton implementerer on/off-egenskaben for en knap. Det er den egenskab som vi kender fra både både JCheckBox og JRadioButton.
JToggleButtons kan have en tekst eller et icon, eller begge dele, idet den har de samme konstruktorer som JRadioButton.