Universität Paderborn - Home Universität Paderborn
Die Universität der Informationsgesellschaft

Grundlagen der Programmierung 2 SS 2005 - Datei MoneyTracker.java

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

public class MoneyTracker extends JFrame
{
   // Referenz auf das ChequeBook (Model)
   private ChequeBook listData;
   
   // Textfelder
   private JTextField purposeField;
   private JTextField amountField;
   
   // Listenfeld
   private JList list;

   MoneyTracker (String title, ChequeBook data, ListCellRenderer render)
   {
      super(title);
      
      // Layout des Fensters setzen
      getContentPane().setLayout(new BorderLayout());
      
      // Setzen der Referenz
      listData = data;
      
      // Listenfeld mit Referenz auf das ChequeBook (listData) einrichten
      // und mit dem dazugehoerigen ListCellRenderer (View) verbinden       
      list = new JList(listData);
      list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
      list.setCellRenderer(render);
      getContentPane().add(new JScrollPane(list), BorderLayout.CENTER);

      // Panel für die Eingabefelder
      JPanel entryArea = new JPanel(new GridLayout(2, 1));
      
      // Textfelder einrichten
      JPanel purposeEntry = new JPanel(new FlowLayout(FlowLayout.LEFT));
      purposeEntry.add(new JLabel("Zweck"));
      purposeField = new JTextField(30);
      purposeEntry.add(purposeField);
      entryArea.add(purposeEntry);
      
      JPanel amountEntry = new JPanel(new FlowLayout(FlowLayout.LEFT));
      amountEntry.add(new JLabel("Betrag"));
      amountField = new JTextField(8);
      amountEntry.add(amountField);
      entryArea.add(amountEntry);
      
      // Buttons setzen
      JButton bookButton = new JButton("Verbuchen");
      amountEntry.add(bookButton);
      
      // Eingabefelder dem Fenster hinzufügen
      getContentPane().add(entryArea, BorderLayout.SOUTH);
            
            
      // Ereignisbehandlung für den "Verbuchen"-Button
      bookButton.addActionListener(new ActionListener()
      {
         public void actionPerformed (ActionEvent e)
         {
            // Strings auslesen
            String purpose = purposeField.getText();
            String amount = amountField.getText();
            
            // Kosten in int konvertieren
            int money;
            try
            {
               money = Integer.parseInt(amount);
            }
            catch (NumberFormatException nfe)
            {
               money = 0;
            }
            
            // Daten zur Liste (Model & View) hinzufügen
            listData.addTransaction(purpose, money);
         }
      });
     
      // Groesse einstellen
      setSize(450, 300);
      
      // Schliessoperation auswaehlen
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      
      // Fenster anzeigen
      setVisible(true);
   }

   // Programm starten
   public static void main (String[] args)
   {
      ChequeBook myMoney = new ChequeBook();
      JFrame f = new MoneyTracker("Where's my money?", myMoney, new DefaultListCellRenderer());
      JFrame f2 = new MoneyTracker("Second Window", myMoney, new BalanceRenderer(myMoney));
   }
}


// Eine eigene Klasse zur Anzeige der Liste
class BalanceRenderer implements ListCellRenderer
{
   // dazugehoeriges Model
   private ChequeBook entries;

   // Konstruktor mit Uebergabe des Models
   BalanceRenderer (ChequeBook data)
   {
      entries = data;
   }

   // Diese Methode wird ausgefuehrt, wenn ein Element der Liste benutzt wird
   public Component getListCellRendererComponent (
      JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
   {
      // Label für ein Element der Liste
      JLabel display = new JLabel("** " + value.toString());
      
      // Wurde das Element ausgewaehlt?
      if (isSelected)
      {
         display.setBackground(Color.yellow);
         display.setForeground(list.getSelectionForeground());
      }
      else
      {
         display.setBackground(list.getBackground());
         display.setForeground(list.getForeground());
      }

      // Farbe abhaengig vom Wert setzen
      int amount = entries.getAmount(index);
      if (amount < 0) display.setForeground(Color.green);
      else if (amount > 500) display.setForeground(Color.red);
      
      // restliche Eigenschaften setzen
      display.setEnabled(list.isEnabled());
      display.setFont(list.getFont());
      display.setOpaque(true);
      
      return display;
   }
}

// Klasse für das Model der Liste
class ChequeBook extends AbstractListModel
{
   // Namen der Kategorien
   private String[] purposes;
   
   // zugehörige Geldbetraege
   private int[] amounts;
   
   // Anzahl der Eintraege
   private int entries = 0;

   // Konstruktor
   ChequeBook ()
   {
      purposes = new String[20];
      amounts = new int[20];
      entries = 0;
   }

   // Eintrag hinzufuegen
   void addTransaction (String p, int a)
   {
      // keine sinnvolle Buchung
      if (p.length() == 0 || a == 0) return;
      
      
      for (int i = 0; i < entries; i++)
      {
         // Kategorie bereits vorhanden
         if (purposes[i].equals(p))
         {
            // Geldbetrag anpassen
            amounts[i] += a;
            
            // Event abfeuern
            fireContentsChanged(this, i, i);
            
            // Methoden beenden
            return;
         }
      }
      
      // neuen Eintrag hinzufuegen
      int index = entries;
      entries += 1;
      purposes[index] = p;
      amounts[index] = a;
      
      // Beobachter informieren
      fireIntervalAdded(this, index, index);
   }

   // Abfrage eines Eintrags
   public Object getElementAt(int index)
   {
      return purposes[index] + ": " + String.valueOf(amounts[index]);
   }

   // Groesse des ChequeBooks zurueckgeben
   public int getSize()
   {
      return entries;
   }

   // Geldbetrag eines Eintrags zurueckgeben
   int getAmount(int index)
   {
      return amounts[index];
   }

   // Kategoriename eines Eintrags zurueckgeben
   String getPurpose(int index)
   {
      return purposes[index];
   }
}

Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 10.05.2005