/********************************************************/
/* Prof. Dr. Carsten Vogt                               */
/* FH Koeln, Fak. 07 / Nachrichtentechnik               */
/* http://www.nt.fh-koeln.de/vogt                       */
/*                                                      */
/* Das Programm zeigt die Verwendung von Auswahllisten. */
/********************************************************/

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

class ListenDemo extends JFrame {

  // Liste mit den Strings, die in ihr stehen sollen:

  private JList liste;
  String[] st = {"Item 1","Item 2","Item 3","Item 4","Item 5","Item 6","Item 7","Item 8","Quit"};

  // Textfeld, in dem angezeigt wird, welches Listenelement ausgewaehlt ist:

  private JTextField textListe;

  // Button: nach Druecken von butLoesch wird die Selektion geloescht

  private JButton butLoesch;

  // Konstruktor: Erzeugung der Grafik-Oberflaeche

  ListenDemo(String s) {

   // Erzeugen und Positionieren des Fensterrahmens:

   super(s);
   setLocation(20,20);
 
   // Box fuer Liste, Button und Ausgabefeld:

   Box b = Box.createVerticalBox();
   getContentPane().add(b);

   // Ueberschrift:

   JLabel lab = new JLabel("Auswahlliste:");
   lab.setFont(new Font("Arial",Font.BOLD,22));
   lab.setForeground(Color.black);
   b.add(lab);
   b.add(Box.createVerticalStrut(10));

   // Erzeugung der Liste (Konstruktorparameter: Strings, die in der Liste stehen sollen):

   liste = new JList(st);

   // Festlegung der Farben:

   liste.setFont(new Font("Arial",Font.BOLD,22));
   liste.setForeground(Color.blue);
   liste.setSelectionForeground(Color.white);
   liste.setSelectionBackground(Color.blue);

   // Festlegung des Selection Modes der Liste:
   // Es koennen beliebig viele Listenelemente in beliebiger Kombination ausgewaehlt werden
   // Alternativen: SINGLE_INTERVAL_SELECTION, SINGLE_SELECTION

   liste.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

   // Vorauswahl: erstes Element

   liste.setSelectedIndex(0);

   // Listener fuer Reaktion bei Aenderung der Auswahl hinzufuegen:

   liste.addListSelectionListener(new AuswahlListener());

   // Einfuegen der Liste ins Fenster:

   Box b2 = Box.createHorizontalBox();
   b2.add(Box.createHorizontalGlue());
   b2.add(liste);
   b2.add(Box.createHorizontalGlue());
   b.add(b2);

   b.add(Box.createVerticalStrut(20));

   // Button, mit dem man die Selektion loescht:

   butLoesch = new JButton("Selektion loeschen");
   butLoesch.setFont(new Font("Arial",Font.BOLD,22));
   butLoesch.setForeground(Color.black);
   b.add(butLoesch);
   butLoesch.addActionListener(new LoeschListener());

   b.add(Box.createVerticalStrut(20));

   // Textkomponente zur Anzeige der ausgewaehlten Listeneintraege:

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

   textListe = new JTextField();
   textListe.setFont(new Font("Arial",Font.BOLD,22));
   textListe.setForeground(Color.black);
   b.add(textListe);

   // Komponenten anordnen und sichtbar machen:

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

  }

  // Aktionen bei Aenderungen der Listenauswahl:

  class AuswahlListener implements ListSelectionListener {

   public void valueChanged(ListSelectionEvent e) {

    if (liste.isSelectedIndex(8))
      // Aktion, wenn Quit ausgewaehlt:
      System.exit(1);

    StringBuffer st = new StringBuffer();

    // in st: Zusammenstellung der Angaben, welche
    // Elemente ausgewaehlt sind ...
    //
    // (alternativ kann auch getSelectedIndices() verwendet werden:
    //  liefert einen Array mit den Indizes der ausgewaehlten Eintraege zurueck.
    //  Oder getSelectedValues(): liefert Array mit den ausgewaehlten Eintraegen.)

    if (liste.isSelectionEmpty())
      st.append("keines");
     else
      for (int i=0;i<8;i++)
       if (liste.isSelectedIndex(i))
        st.append(Integer.toString(i+1)+" ");

    // ... und Ausgabe:

    textListe.setText(st.toString());     

   }

  }

  // Aktionen bei Loeschen der Selektion:

  class LoeschListener implements ActionListener {

   public void actionPerformed(ActionEvent e) {

    liste.clearSelection();     

   }

  }

}

// Hauptprogramm

public class Listen {

  public static void main(String args[]) {

   // Hauptprogramm: Erzeugung der Oberflaeche

   new ListenDemo("Listen");

  }

}

