CIS 35A: Introduction to Java Programming

Home | Green Sheet | Lectures | Assignments | FAQ | Grades

Events

Events
Application
Code

The Product Maintenance application

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

public class ProductMaintenanceApp
{
    public static void main(String[] args)
    {
        JFrame frame = new ProductMaintenanceFrame();
        frame.setVisible(true);
    }
}

class ProductMaintenanceFrame extends JFrame
{
    public ProductMaintenanceFrame()
    {
        setTitle("Product Display");
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.add(new ProductMaintenancePanel());
        this.pack();
        centerWindow(this);
    }


    private void centerWindow(Window w)
    {
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension d = tk.getScreenSize();
        setLocation((d.width-w.getWidth())/2,
            (d.height-w.getHeight())/2);
    }
}

class ProductMaintenancePanel extends JPanel
{
    ProductDAO productDAO;
    ArrayList products;
    Product newProduct = null;

    ProductSelectorPanel selectorPanel;
    ProductDisplayPanel productPanel;
    ProductButtonPanel buttonPanel;

    public ProductMaintenancePanel()
    {
        // fill the products ArrayList
        productDAO = DAOFactory.getProductDAO();
        products = productDAO.getProducts();

        // add the panels
        setLayout(new GridBagLayout());
        selectorPanel = new ProductSelectorPanel();
        add(selectorPanel, getConstraints(
            0,0,1,1, GridBagConstraints.EAST));
        productPanel = new ProductDisplayPanel();
        add(productPanel, getConstraints(
            0,1,1,1, GridBagConstraints.EAST));
        buttonPanel = new ProductButtonPanel();
        add(buttonPanel, getConstraints(
            0,2,1,1, GridBagConstraints.EAST));

        // set the initial product to be displayed
        productPanel.showProduct(products.get(0));
        selectorPanel.selectProduct(products.get(0));
    }

    // a method for setting grid bag constraints
    private GridBagConstraints getConstraints(int gridx,
    int gridy, int gridwidth, int gridheight, int anchor)
    {
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(5, 5, 5, 5);
        c.ipadx = 0;
        c.ipady = 0;
        c.gridx = gridx;
        c.gridy = gridy;
        c.gridwidth = gridwidth;
        c.gridheight = gridheight;
        c.anchor = anchor;
        return c;
    }

    class ProductSelectorPanel extends JPanel
                               implements ActionListener
    {
        public JComboBox    productComboBox;
        private JLabel      productLabel;

        boolean filling = false;      // used to indicate the
                                      // combo box is being filled
        public ProductSelectorPanel()
        {
            // set panel layout
            setLayout(new FlowLayout(FlowLayout.LEFT));

            // product label
            productLabel = new JLabel("Select Product:");
            add(productLabel);

            // product combo box
            productComboBox = new JComboBox();
            fillComboBox(products);
            productComboBox.addActionListener(this);
            add(productComboBox);
        }

        public void actionPerformed(ActionEvent e)
        {
            if (!filling)
            {
                Product p =
                    (Product)productComboBox.getSelectedItem();
                productPanel.showProduct(p);
            }
        }

        public void fillComboBox(ArrayList a)
        {
            filling = true;
            productComboBox.removeAllItems();
            for (Product p : a)
                productComboBox.addItem(p);
            filling = false;
        }

        public void selectProduct(Product p)
        {
            productComboBox.setSelectedItem(p);
        }

        public Product getCurrentProduct()
        {
            return
                (Product) productComboBox.getSelectedItem();
        }
    }

    class ProductDisplayPanel extends JPanel
    {
        public JTextField   codeTextField,
                            descriptionTextField,
                            priceTextField;
        private JLabel      codeLabel,
                            descriptionLabel,
                            priceLabel;

        public ProductDisplayPanel()
        {
            // set panel layout
            setLayout(new GridBagLayout());

            // code label
            codeLabel = new JLabel("Product Code:");
            add(codeLabel, getConstraints(
                0,0,1,1, GridBagConstraints.EAST));

            // code text field
            codeTextField = new JTextField(10);
            codeTextField.setEditable(false);
            codeTextField.setFocusable(false);
            codeTextField.addFocusListener(new AutoSelect());
            add(codeTextField, getConstraints(
                1,0,1,1, GridBagConstraints.WEST));

            // description label
            descriptionLabel = new JLabel("Desription:");
            add(descriptionLabel, getConstraints(
                0,1,1,1, GridBagConstraints.EAST));

            // description text field
            descriptionTextField = new JTextField(30);
            descriptionTextField.setEditable(false);
            descriptionTextField.setFocusable(false);
            descriptionTextField.addFocusListener(new AutoSelect());
            add(descriptionTextField, getConstraints(
                1,1,1,1, GridBagConstraints.WEST));
            // price label
            priceLabel = new JLabel("Unit Price:");
            add(priceLabel, getConstraints(
                0,2,1,1, GridBagConstraints.EAST));

            // price text field
            priceTextField = new JTextField(10);
            priceTextField.setEditable(false);
            priceTextField.setFocusable(false);
            priceTextField.addFocusListener(new AutoSelect());
            priceTextField.addKeyListener(new NumFilter());
            add(priceTextField, getConstraints(
                1,2,1,1, GridBagConstraints.WEST));
        }

        public void showProduct(Product p)
        {
            codeTextField.setText(p.getCode());
            descriptionTextField.setText(p.getDescription());
            priceTextField.setText(p.getFormattedPrice());
        }

        public void clearFields()
        {
            codeTextField.setText("");
            descriptionTextField.setText("");
            priceTextField.setText("");
        }

        // return a Product object with the data in the text fields
        public Product getProduct()
        {
            Product p = new Product();
            p.setCode(codeTextField.getText());
            p.setDescription(descriptionTextField.getText());
            p.setPrice(Double.parseDouble(
                priceTextField.getText()));
            return p;
        }

        public void setAddMode()
        {
            codeTextField.setEditable(true);
            codeTextField.setFocusable(true);
            codeTextField.requestFocusInWindow();
            descriptionTextField.setEditable(true);
            descriptionTextField.setFocusable(true);
            priceTextField.setEditable(true);
            priceTextField.setFocusable(true);
        }

        public void setEditMode()
        {
            descriptionTextField.setEditable(true);
            descriptionTextField.setFocusable(true);
            descriptionTextField.requestFocusInWindow();
            priceTextField.setEditable(true);
            priceTextField.setFocusable(true);
        }

        public void setDisplayMode()
        {
            codeTextField.setEditable(false);
            codeTextField.setFocusable(false);
            descriptionTextField.setEditable(false);
            descriptionTextField.setFocusable(false);
            priceTextField.setEditable(false);
            priceTextField.setFocusable(false);
        }
    }

    class ProductButtonPanel extends JPanel
    {
        public JButton addButton,
                       editButton,
                       deleteButton,
                       acceptButton,
                       cancelButton,
                       exitButton;

        public ProductButtonPanel()
        {
            // create maintenance button panel
            JPanel maintPanel = new JPanel();
            maintPanel.setLayout(new FlowLayout(FlowLayout.CENTER));

            // add button
            addButton = new JButton("Add");
            addButton.addActionListener(new AddListener());
            maintPanel.add(addButton);

            // edit button
            editButton = new JButton("Edit");
            editButton.addActionListener(new EditListener());
            maintPanel.add(editButton);
            // delete button
            deleteButton = new JButton("Delete");
            deleteButton.addActionListener(new DeleteListener());
            maintPanel.add(deleteButton);

            // accept button
            acceptButton = new JButton("Accept");
            acceptButton.setEnabled(false);
            acceptButton.addActionListener(new AcceptListener());
            maintPanel.add(acceptButton);

            // cancel button
            cancelButton = new JButton("Cancel");
            cancelButton.setEnabled(false);
            cancelButton.addActionListener(new CancelListener());
            maintPanel.add(cancelButton);

            // create exit button panel
            JPanel exitPanel = new JPanel();
            exitPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));

            // exit button
            exitButton = new JButton("Exit");
            exitButton.addActionListener(new ExitListener());
            exitPanel.add(exitButton);

            // add panels to the ProductButtonPanel
            setLayout(new BorderLayout());
            add(maintPanel, BorderLayout.CENTER);
            add(exitPanel, BorderLayout.SOUTH);
        }

        public void setAddEditMode(boolean e)
        {
            addButton.setEnabled(!e);
            editButton.setEnabled(!e);
            deleteButton.setEnabled(!e);
            acceptButton.setEnabled(e);
            cancelButton.setEnabled(e);
        }
    }

    class AddListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            newProduct = new Product();
            productPanel.clearFields();
            buttonPanel.setAddEditMode(true);
            productPanel.setAddMode();
        }
    }

    class EditListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            buttonPanel.setAddEditMode(true);
            productPanel.setEditMode();
        }
    }

    class DeleteListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            Product p = productPanel.getProduct();
            productDAO.deleteProduct(p);
            products.remove(p);
            selectorPanel.fillComboBox(products);
            selectorPanel.selectProduct(products.get(0));
            productPanel.showProduct(products.get(0));
            selectorPanel.productComboBox.requestFocusInWindow();
        }
    }

    class AcceptListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            if (isValidData())
            {
                if (newProduct != null)
                {
                    newProduct = productPanel.getProduct();
                    productDAO.addProduct(newProduct);
                    products.add(newProduct);
                    selectorPanel.fillComboBox(products);
                    selectorPanel.selectProduct(newProduct);
                    newProduct = null;
                }
                else
                {
                    Product p = selectorPanel.getCurrentProduct();
                    Product newProduct = productPanel.getProduct();
                    p.setDescription(newProduct.getDescription());
                    p.setPrice(newProduct.getPrice());
                    productDAO.updateProduct(p);
                    selectorPanel.fillComboBox(products);
                    selectorPanel.selectProduct(p);
                    productPanel.showProduct(
                        selectorPanel.getCurrentProduct());
                }
                productPanel.setDisplayMode();
                buttonPanel.setAddEditMode(false);
                selectorPanel.productComboBox.requestFocusInWindow();
            }
        }
        public boolean isValidData()
        {
            if (newProduct != null)
                return SwingValidator.isPresent(
                       productPanel.codeTextField, "Product Code")
                    && SwingValidator.isPresent(
                       productPanel.descriptionTextField,
                       "Description")
                    && SwingValidator.isPresent(
                       productPanel.priceTextField, "Unit Price")
                    && SwingValidator.isDouble(
                       productPanel.priceTextField, "Unit Price");
            else
                return SwingValidator.isPresent(
                       productPanel.descriptionTextField,
                      "Description")
                    && SwingValidator.isPresent(
                       productPanel.priceTextField, "Unit Price")
                    && SwingValidator.isDouble(
                       productPanel.priceTextField, "Unit Price");
        }
    }

    class CancelListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            if (newProduct != null)
            {
                newProduct = null;
            }
            productPanel.setDisplayMode();
            productPanel.showProduct(
                selectorPanel.getCurrentProduct());
            buttonPanel.setAddEditMode(false);
            selectorPanel.productComboBox.requestFocusInWindow();
        }
    }

    class ExitListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            System.exit(0);
        }
    }
}
Previous | Product Maintenance | Code