01: import java.awt.*;
02: import java.awt.event.*;
03: import javax.swing.*;
04: import javax.swing.event.*;
05: 
06: /**
07:    A program that tests the invoice classes.
08: */
09: public class InvoiceTester
10: {
11:    public static void main(String[] args)
12:    {
13:       final Invoice invoice = new Invoice();
14:       final InvoiceFormatter formatter = new SimpleFormatter();
15: 
16:       // This text area will contain the formatted invoice
17:       final JTextArea textArea = new JTextArea(20, 40);
18: 
19:       // When the invoice changes, update the text area
20:       ChangeListener listener = new
21:          ChangeListener()
22:          {
23:             public void stateChanged(ChangeEvent event)
24:             {
25:                textArea.setText(invoice.format(formatter));
26:             }
27:          };
28:       invoice.addChangeListener(listener);
29: 
30:       // Add line items to a combo box
31:       final JComboBox combo = new JComboBox();
32:       Product hammer = new Product("Hammer", 19.95);
33:       Product nails = new Product("Assorted nails", 9.95);
34:       combo.addItem(hammer);
35:       Bundle bundle = new Bundle();
36:       bundle.add(hammer);
37:       bundle.add(nails);
38:       combo.addItem(new DiscountedItem(bundle, 10));
39: 
40:       // Make a button for adding the currently selected
41:       // item to the invoice
42:       JButton addButton = new JButton("Add");
43:       addButton.addActionListener(new
44:          ActionListener()
45:          {
46:             public void actionPerformed(ActionEvent event)
47:             {
48:                LineItem item = (LineItem) combo.getSelectedItem();
49:                invoice.addItem(item);
50:             }
51:          });
52: 
53:       // Put the combo box and the add button into a panel
54:       JPanel panel = new JPanel();
55:       panel.add(combo);
56:       panel.add(addButton);
57: 
58:       // Add the text area and panel to the content pane
59:       JFrame frame = new JFrame();
60:       frame.add(new JScrollPane(textArea),
61:          BorderLayout.CENTER);
62:       frame.add(panel, BorderLayout.SOUTH);
63:       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
64:       frame.pack();
65:       frame.setVisible(true);
66:    }
67: }