views:

83

answers:

2

I have a simple form setup and I was following how the book, Core Java Vol I, sets up their forms, where they have a top level class that extends JFrame create objects of the different components, and lays them out in the frame. If this isn't the way you are "typically" supposed to do it, please let me know.

I got confused when I wrote my inner classes to perform actions when buttons were pressed. I could put my inner class in my AddressBookForm class since that's where I put my buttons and it would have access to the private variables of the JTextFields. The problem I have (assuming so far the other parts are 'ok'), is I don't know how to get the addressList.size() so I can update my statusBar label with the total number of people when the Insert button is pressed. Any thoughts? Thanks.

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

public class AddressBook
{
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                AddressBookFrame frame = new AddressBookFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JMenuBar menuBar = new JMenuBar();
                frame.setJMenuBar(menuBar);

                JMenu fileMenu = new JMenu("File");
                JMenuItem openItem = new JMenuItem("Open");
                JMenuItem saveItem = new JMenuItem("Save");
                JMenuItem saveAsItem = new JMenuItem("Save As");
                JMenuItem printItem = new JMenuItem("Print");
                JMenuItem exitItem = new JMenuItem("Exit");
                fileMenu.add(openItem);
                fileMenu.add(saveItem);
                fileMenu.add(saveAsItem);
                fileMenu.add(printItem);
                fileMenu.add(exitItem);
                menuBar.add(fileMenu);

                JMenu editMenu = new JMenu("Edit");
                JMenuItem newItem = new JMenuItem("New");
                JMenuItem editItem = new JMenuItem("Edit");
                JMenuItem deleteItem = new JMenuItem("Delete");
                JMenuItem findItem = new JMenuItem("Find");
                JMenuItem firstItem = new JMenuItem("First");
                JMenuItem previousItem = new JMenuItem("Previous");
                JMenuItem nextItem = new JMenuItem("Next");
                JMenuItem lastItem = new JMenuItem("Last");
                editMenu.add(newItem);
                editMenu.add(editItem);
                editMenu.add(deleteItem);
                editMenu.add(findItem);
                editMenu.add(firstItem);
                editMenu.add(previousItem);
                editMenu.add(nextItem);
                editMenu.add(lastItem);
                menuBar.add(editMenu);

                JMenu helpMenu = new JMenu("Help");
                JMenuItem documentationItem = new JMenuItem("Documentation");
                JMenuItem aboutItem = new JMenuItem("About");
                helpMenu.add(documentationItem);
                helpMenu.add(aboutItem);

                menuBar.add(helpMenu);

                frame.setVisible(true);

            }
        });
    }
}

class AddressBookFrame extends JFrame
{
    public AddressBookFrame() 
    {
        setLayout(new BorderLayout());
        setTitle("Address Book");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        AddressBookToolBar toolBar = new AddressBookToolBar();
        add(toolBar, BorderLayout.NORTH);
        AddressBookStatusBar aStatusBar = new AddressBookStatusBar();
        add(aStatusBar, BorderLayout.SOUTH);
        AddressBookForm form = new AddressBookForm();
        add(form, BorderLayout.CENTER);
    }
    public static final int DEFAULT_WIDTH = 500;
    public static final int DEFAULT_HEIGHT = 500;

}

/* Create toolbar buttons and add buttons to toolbar */
class AddressBookToolBar extends JPanel
{
    public AddressBookToolBar()
    {
        setLayout(new FlowLayout(FlowLayout.LEFT));
        JToolBar bar = new JToolBar();
        JButton newButton = new JButton("New");
        JButton editButton = new JButton("Edit");
        JButton deleteButton = new JButton("Delete");
        JButton findButton = new JButton("Find");
        JButton firstButton = new JButton("First");
        JButton previousButton = new JButton("Previous");
        JButton nextButton = new JButton("Next");
        JButton lastButton = new JButton("Last");
        bar.add(newButton);
        bar.add(editButton);
        bar.add(deleteButton);
        bar.add(findButton);
        bar.add(firstButton);
        bar.add(previousButton);
        bar.add(nextButton);
        bar.add(lastButton);
        add(bar);
    }
}

/* Creates the status bar string */
class AddressBookStatusBar extends JPanel
{
    public AddressBookStatusBar()
    {
        setLayout(new FlowLayout(FlowLayout.LEFT));
        this.statusBarString = new JLabel("Total: " + totalContacts);
        add(this.statusBarString);
    }

    public void updateLabel(int n)
    {
        contactsLabel.setText((new Integer(n)).toString());
    }

    private JLabel statusBarString;
    private JLabel contactsLabel;
}

class AddressBookForm extends JPanel
{
    public AddressBookForm()
    {   
        // create form panel
        this.setLayout(new GridLayout(2, 1));
        JPanel formPanel = new JPanel();
        formPanel.setLayout(new GridLayout(4, 2));
        firstName = new JTextField(20);
        lastName = new JTextField(20);
        telephone = new JTextField(20);
        email = new JTextField(20);
        JLabel firstNameLabel = new JLabel("First Name: ", JLabel.LEFT);
        formPanel.add(firstNameLabel);
        formPanel.add(firstName);
        JLabel lastNameLabel = new JLabel("Last Name: ", JLabel.LEFT); 
        formPanel.add(lastNameLabel);
        formPanel.add(lastName);
        JLabel telephoneLabel = new JLabel("Telephone: ", JLabel.LEFT);
        formPanel.add(telephoneLabel);
        formPanel.add(telephone);
        JLabel emailLabel = new JLabel("Email: ", JLabel.LEFT);
        formPanel.add(emailLabel);
        formPanel.add(email);
        add(formPanel);

        // create button panel
        JPanel buttonPanel = new JPanel();
        JButton insertButton = new JButton("Insert");
        JButton displayButton = new JButton("Display");

        ActionListener insertAction = new AddressBookListener();
        ActionListener displayAction = new AddressBookListener();
        insertButton.addActionListener(insertAction);
        displayButton.addActionListener(displayAction);
        buttonPanel.add(insertButton);
        buttonPanel.add(displayButton);
        add(buttonPanel);
    }

    public int getTotalContacts()
    {
        return addressList.size();
    }

    private JTextField firstName;
    private JTextField lastName;
    private JTextField telephone;
    private JTextField email;
    private JLabel contacts;

    private List<Person> addressList = new ArrayList<Person>();

    private class AddressBookListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            String buttonPressed = e.getActionCommand();
            System.out.println(buttonPressed);
            if (buttonPressed == "Insert") {
                Person aPerson = new Person(firstName.getText(), lastName.getText(), telephone.getText(), email.getText());
                addressList.add(aPerson);
            }
            else {
                for (Person p : addressList) {
                    System.out.println(p);
                }
            }
        }
    }

}
+1  A: 

Don't store a list of persons in a component, that's tight coupling.

Have a service class or interface that provides the list of Persons, something like this

public interface AddressBookService {

    List<Person> getContacts();

    void addContact(Person contact);

    void deleteContact(Person person);

}

Now give each of your components access to this service, either by injecting it or by using it as a singleton or any other lookup method.

seanizer
I don't think I totally get it yet. So the Service is a helper class. Where would I declare my List<Person>? Is it a private variable of a class? I guess I don't see how two separate classes are going to access the same List.
Crystal
you declare the list in the helper class, inject the helper class into your components and call addressBookService.getContacts() instead of storing the list locally.
seanizer
A: 

I vote for seanizer's solution, but if you insist on using your code, you can make use of accessing outer class's addressList variable (AddressBookFrame) in its inner classes this way:

class AddressBookFrame extends JFrame {

private List<Person> addressList = new ArrayList<Person>();

public AddressBookFrame() {
    setLayout(new BorderLayout());
    setTitle("Address Book");
    setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    AddressBookToolBar toolBar = new AddressBookToolBar();
    add(toolBar, BorderLayout.NORTH);
    AddressBookStatusBar aStatusBar = new AddressBookStatusBar();
    add(aStatusBar, BorderLayout.SOUTH);
    AddressBookForm form = new AddressBookForm();
    add(form, BorderLayout.CENTER);
}

public static final int DEFAULT_WIDTH = 500;
public static final int DEFAULT_HEIGHT = 500;

/* Creates the status bar string */
class AddressBookStatusBar extends JPanel {
    public AddressBookStatusBar() {
        setLayout(new FlowLayout(FlowLayout.LEFT));
        this.statusBarString = new JLabel("Total: " + addressList.size());
        add(this.statusBarString);
    }

    public void updateLabel(int n) {
        contactsLabel.setText((new Integer(n)).toString());
    }

    private JLabel statusBarString;
    private JLabel contactsLabel;
}

/* Create toolbar buttons and add buttons to toolbar */
class AddressBookToolBar extends JPanel {
    public AddressBookToolBar() {
        setLayout(new FlowLayout(FlowLayout.LEFT));
        JToolBar bar = new JToolBar();
        JButton newButton = new JButton("New");
        JButton editButton = new JButton("Edit");
        JButton deleteButton = new JButton("Delete");
        JButton findButton = new JButton("Find");
        JButton firstButton = new JButton("First");
        JButton previousButton = new JButton("Previous");
        JButton nextButton = new JButton("Next");
        JButton lastButton = new JButton("Last");
        bar.add(newButton);
        bar.add(editButton);
        bar.add(deleteButton);
        bar.add(findButton);
        bar.add(firstButton);
        bar.add(previousButton);
        bar.add(nextButton);
        bar.add(lastButton);
        add(bar);
    }
}

class AddressBookForm extends JPanel {
    public AddressBookForm() {
        // create form panel
        this.setLayout(new GridLayout(2, 1));
        JPanel formPanel = new JPanel();
        formPanel.setLayout(new GridLayout(4, 2));
        firstName = new JTextField(20);
        lastName = new JTextField(20);
        telephone = new JTextField(20);
        email = new JTextField(20);
        JLabel firstNameLabel = new JLabel("First Name: ", JLabel.LEFT);
        formPanel.add(firstNameLabel);
        formPanel.add(firstName);
        JLabel lastNameLabel = new JLabel("Last Name: ", JLabel.LEFT);
        formPanel.add(lastNameLabel);
        formPanel.add(lastName);
        JLabel telephoneLabel = new JLabel("Telephone: ", JLabel.LEFT);
        formPanel.add(telephoneLabel);
        formPanel.add(telephone);
        JLabel emailLabel = new JLabel("Email: ", JLabel.LEFT);
        formPanel.add(emailLabel);
        formPanel.add(email);
        add(formPanel);

        // create button panel
        JPanel buttonPanel = new JPanel();
        JButton insertButton = new JButton("Insert");
        JButton displayButton = new JButton("Display");

        ActionListener insertAction = new AddressBookListener();
        ActionListener displayAction = new AddressBookListener();
        insertButton.addActionListener(insertAction);
        displayButton.addActionListener(displayAction);
        buttonPanel.add(insertButton);
        buttonPanel.add(displayButton);
        add(buttonPanel);
    }

    public int getTotalContacts() {
        return addressList.size();
    }

    private JTextField firstName;
    private JTextField lastName;
    private JTextField telephone;
    private JTextField email;
    private JLabel contacts;

    private class AddressBookListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String buttonPressed = e.getActionCommand();
            System.out.println(buttonPressed);
            if (buttonPressed == "Insert") {
                Person aPerson = new Person(firstName.getText(), lastName
                        .getText(), telephone.getText(), email.getText());
                addressList.add(aPerson);
            } else {
                for (Person p : addressList) {
                    System.out.println(p);
                }
            }
        }
    }

}

}