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