как запускать действие в родительской JPanel при обновлении компонента в дочерней JPanel (Java Swing)

Я пытаюсь создать приложение MVC на Java Swing. У меня есть JPanel, который содержит четыре JComboBoxes, и этот JPanel встроен в родительский JPanel. У родительской JPanel есть другие элементы управления в дополнение к дочерней JPanel.

Дочерняя модель JPanel корректно обновляется всякий раз, когда я меняю значения JComboBoxes (в основном это средство выбора даты с одним полем со списком для каждого года, месяца, дня месяца и часа дня). Я не могу понять, как я могу вызвать обновление родительской модели JPanel, чтобы она соответствовала значению, хранящемуся в дочерней модели JPanel, при изменении одного из JComboBox.

Ниже приведен сокращенный SSCCE структуры того, что у меня есть. Спасибо.

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

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 {
    public OuterView() {
        super();
        InnerView innerPanel = new InnerView();
        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");
        }
    }
}

class InnerView extends JPanel {
    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();
            System.out.println("store " + text + " in InnerView's model");
            System.out.println("now how do I cause OuterView's model to be updated to get the info from InnerView's model?");
        }        
    }
}
7
задан Bo Persson 19 February 2012 в 12:28
поделиться