import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;

@SuppressWarnings("serial")
public class Example extends JFrame {
    public Example() {
        super();
        OuterView theGUI = new OuterView();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        add(theGUI);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Example();
            }
        });
    }
}

class OuterView extends JPanel {
    private String innerValue = "";

    public OuterView() {
        super();
        InnerView innerPanel = new InnerView();
        innerPanel.addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equals(InnerView.COMBO_CHANGED)) {
                    innerValue = evt.getNewValue().toString();
                    System.out.println("new value from inside of OuterView: "
                            + innerValue);
                }
            }
        });
        JButton button = new JButton("display OuterView's model");
        button.addActionListener(new ButtonListener());
        add(innerPanel);
        add(button);
    }

    private class ButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent ae) {
            System.out.println("button was clicked. innerValue: " + innerValue);
        }
    }
}

class InnerView extends JPanel {
    public static final String COMBO_CHANGED = "Combo Changed";
    // private SwingPropertyChangeSupport pcSupport = new
    // SwingPropertyChangeSupport(this);
    String oldValue = "";

    public InnerView() {
        super();
        String[] items = new String[] { "item 1", "item 2", "item 3" };
        JComboBox comboBox = new JComboBox(items);
        comboBox.addActionListener(new ComboBoxListener());
        add(comboBox);

    }

    private class ComboBoxListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent ae) {
            String text = ((JComboBox) ae.getSource()).getSelectedItem()
                    .toString();
            firePropertyChange(COMBO_CHANGED, oldValue, text);
            oldValue = text;
            System.out.println("store " + text + " in InnerView's model");
        }
    }
}