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


