/******************************************************************/
/* Prof. Dr. Carsten Vogt                                         */
/* FH Koeln, Fak. 07 / Nachrichtentechnik                         */
/* http://www.nt.fh-koeln.de/vogt                                 */
/*                                                                */
/* Das Programm demonstriert verschiedene Arten von Buttons:      */
/* Einfache Buttons, Radio Buttons, Checkboxen                    */
/* Mit Hilfe von PLAF (= Pluggable Look And Feel) wird der Ober-  */
/* flaechenstil von Windows eingestellt (funktioniert evtl. nicht */
/* auf anderen Plattformen als Windows.                           */            
/******************************************************************/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

// Fenster mit verschiedenen Button-Arten:

class ButtonFrame extends JFrame {

  // Drei einfache Buttons zum Anklicken

  private JButton butEinfach1, butEinfach2, butQuit;

  // Checkbox mit einem oder mehreren Feldern zum "Ankreuzen":

  private JCheckBox[] checkbox;

  // Radiobuttons:

  private JRadioButton[] radioArray;

  // Button-Gruppe: nur einer der Buttons kann ausgewaehlt sein  

  private ButtonGroup radioGroup;

  // Textfelder zur Anzeige,
  // welcher Button gedrueckt wurde, angekreuzt bzw. ausgewaehlt ist:

  private JTextField textFeldEinfach, textFeldCheckbox, textFeldRadio;

  // Konstruktor zur Erzeugung der Grafik-Oberflaeche:

  ButtonFrame(String s) {

   // Erzeugen des Fensterrahmens:

   super(s);
   Container c = getContentPane();
   c.setLayout(new GridLayout(20,1));
   c.setForeground(Color.black);

   // Hilfsvariable für statische Texte:

   JLabel lab;

   //// Drei einfache Buttons 

   // Erzeugen und Einfuegen in das Fenster:

   lab = new JLabel("Drei einfache Buttons:");
   lab.setFont(new Font("Arial",Font.BOLD,22));
   lab.setForeground(Color.black);
   c.add(lab);

   butEinfach1 = new JButton("Einfacher Button 1");
   butEinfach1.setFont(new Font("Arial",Font.BOLD,20));
   butEinfach1.setForeground(Color.blue);
   c.add(butEinfach1);

   butEinfach2 = new JButton("Einfacher Button 2");
   butEinfach2.setFont(new Font("Arial",Font.BOLD,20));
   butEinfach2.setForeground(Color.blue);
   c.add(butEinfach2);

   butQuit = new JButton("Quit");
   butQuit.setFont(new Font("Arial",Font.BOLD,20));
   butQuit.setForeground(Color.blue);
   c.add(butQuit);

   // Listener fuer die Buttons festlegen:
   // (Class ButtonEinfachListener siehe unten)

   ButtonEinfachListener lisEinfach = new ButtonEinfachListener();
   butEinfach1.addActionListener(lisEinfach);
   butEinfach2.addActionListener(lisEinfach);
   butQuit.addActionListener(lisEinfach);

   // Textkomponenten zur Anzeige eines gedrueckten Buttons:

   lab = new JLabel("gedrueckter einfacher Button:");
   lab.setFont(new Font("Arial",Font.BOLD,20));
   lab.setForeground(Color.black);
   c.add(lab);

   textFeldEinfach = new JTextField(28);
   textFeldEinfach.setFont(new Font("Arial",Font.BOLD,20));
   textFeldEinfach.setForeground(Color.blue);
   c.add(textFeldEinfach);

   // Leerzeile

   lab = new JLabel(" ");
   c.add(lab);

   //// Checkbox mit drei Buttons:

   // Erzeugen und Einfügen in das Fenster:

   lab = new JLabel("Checkbox:");
   lab.setFont(new Font("Arial",Font.BOLD,22));
   lab.setForeground(Color.black);
   c.add(lab);

   checkbox = new JCheckBox[3];

   checkbox[0] = new JCheckBox("Check 1",true); // Check 1 ist vorausgewählt
   checkbox[1] = new JCheckBox("Check 2");
   checkbox[2] = new JCheckBox("Check 3");

   for (int i=0;i<3;i++) {
    checkbox[i].setFont(new Font("Arial",Font.BOLD,20));
    checkbox[i].setForeground(Color.blue);
    c.add(checkbox[i]);
   }

   // Listener festlegen:
   // (Class CheckboxListener siehe unten):

   CheckboxListener lisCheckbox = new CheckboxListener();
   for (int i=0;i<3;i++)
    checkbox[i].addItemListener(lisCheckbox);

   // Textkomponenten zur Anzeige des Checkbox-Zustands:

   lab = new JLabel("in Checkbox ausgewaehlt:");
   lab.setFont(new Font("Arial",Font.BOLD,20));
   lab.setForeground(Color.black);
   c.add(lab);

   textFeldCheckbox = new JTextField(28);
   textFeldCheckbox.setFont(new Font("Arial",Font.BOLD,20));
   textFeldCheckbox.setForeground(Color.blue);
   c.add(textFeldCheckbox);

   // Leerzeile:

   lab = new JLabel(" ");
   c.add(lab);

   //// Drei Radiobuttons:

   // Erzeugen und Einfuegen in das Fenster:

   lab = new JLabel("Radiobuttons:");
   lab.setFont(new Font("Arial",Font.BOLD,22));
   lab.setForeground(Color.black);
   c.add(lab);

   radioArray = new JRadioButton[3];
   radioArray[0] = new JRadioButton("Radio 1",true); // vorausgewählt
   radioArray[1] = new JRadioButton("Radio 2");
   radioArray[2] = new JRadioButton("Radio 3");

   radioGroup = new ButtonGroup();

   for (int i=0;i<3;i++) {
    radioArray[i].setFont(new Font("Arial",Font.BOLD,20));
    radioArray[i].setForeground(Color.blue);
    // Einfügen der Radiobuttons in die Radiogroup:
    // Stellt sicher, daß jeweils nur einer von ihnen ausgewählt sein kann
    radioGroup.add(radioArray[i]);
    c.add(radioArray[i]);
   }

   // Listener festlegen:
   // (Class RadioListener siehe unten):

   RadioListener lisRadio = new RadioListener();
   for (int i=0;i<3;i++)
    radioArray[i].addItemListener(lisRadio);

   // Textkomponenten zur Anzeige des Zustands der Radiobuttons:

   lab = new JLabel("ausgewaehlter Radiobutton:");
   lab.setFont(new Font("Arial",Font.BOLD,20));
   lab.setForeground(Color.black);
   c.add(lab);

   textFeldRadio = new JTextField(28);
   textFeldRadio.setFont(new Font("Arial",Font.BOLD,20));
   textFeldRadio.setForeground(Color.blue);
   c.add(textFeldRadio);

   // Komponenten anordnen und sichtbar machen:

   setLocation(0,0);
   pack();
   setVisible(true);

  }

  // Listener fuer einfache Buttons

  class ButtonEinfachListener implements ActionListener {

   public void actionPerformed(ActionEvent e) {

    // Aktionen beim Anklicken eines einfachen Buttons:

    if (e.getActionCommand().equals("Einfacher Button 1"))
      textFeldEinfach.setText("Button 1");

    if (e.getActionCommand().equals("Einfacher Button 2"))
      textFeldEinfach.setText("Button 2");

    if (e.getActionCommand().equals("Quit"))
      System.exit(1);

   }

  }

  // Listener fuer Checkboxen:

  class CheckboxListener implements ItemListener {

   // Aktionen bei Aenderung des Zustands eines Checkbox-Elements:

   public void itemStateChanged(ItemEvent e) {

    StringBuffer st = new StringBuffer();

    // In st Zusammenstellung der Meldungen ...

    if (checkbox[0].isSelected())
     st.append("Check 1  ");        

    if (checkbox[1].isSelected())
     st.append("Check 2  ");        

    if (checkbox[2].isSelected())
     st.append("Check 3  ");

    if (st.length()==0)
     st.append("Nix");

    // ... und Ausgabe:

    textFeldCheckbox.setText(st.toString());        

   }

  }

  // Listener fuer Radiobuttons:

  class RadioListener implements ItemListener {

   // Aktionen bei Neuauswahl eines Radiobuttons:

   public void itemStateChanged(ItemEvent e) {

    if (radioArray[0].isSelected())
     textFeldRadio.setText("Radio 1");        

    if (radioArray[1].isSelected())
     textFeldRadio.setText("Radio 2");        

    if (radioArray[2].isSelected())
     textFeldRadio.setText("Radio 3");        

   }

  }

}


// Hauptprogramm: erzeugt den Frame mit den Buttons

public class ButtonsWinLAF {

  public static void main(String args[]) throws ClassNotFoundException {

    // Einstellung des Windows Look And Feel

    try {

     UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

    }
    catch (UnsupportedLookAndFeelException e) {}
    catch (IllegalAccessException e) {}
    catch (InstantiationException e) {}
    catch (ClassNotFoundException e) {};

    // Erzeugung des Rahmens

    new ButtonFrame("Arten von Buttons");  

  }

}

