2012-02-19 14 views
7

Tôi đang cố gắng xây dựng một ứng dụng MVC trong Java Swing. Tôi có một JPanel có chứa bốn JComboBox và JPanel này được nhúng vào một phụ huynh JPanel. Phụ huynh JPanel có các điều khiển khác ngoài con JPanel.cách kích hoạt một hành động trong JPanel mẹ khi một thành phần trong một JPanel con được cập nhật (Java Swing)

Mô hình con JPanel được cập nhật chính xác bất cứ khi nào tôi thay đổi giá trị của JComboBoxes (về cơ bản là bộ chọn ngày có một hộp kết hợp mỗi năm, tháng, ngày trong tháng và giờ trong ngày). Những gì tôi không thể tìm ra là làm thế nào tôi có thể kích hoạt mô hình của cha mẹ JPanel để cập nhật chính nó để phù hợp với giá trị được lưu trữ trong mô hình con JPanel bất cứ khi nào một trong những JComboBoxes được thay đổi.

Dưới đây là một SSCCE bị tước bỏ cấu trúc của những gì tôi có cho đến nay. Cảm ơn bạn.

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?"); 
     }   
    } 
} 
+0

Cha mẹ nên có người nghe trên mô hình của trẻ. –

+0

Hoặc bạn có thể _forward_ sự kiện cho phụ huynh, như được hiển thị [ở đây] (http://stackoverflow.com/q/2159803/230513). – trashgod

Trả lời

15

Bạn có thể sử dụng PropertyChangeListener và trên thực tế, một ứng dụng được tích hợp vào mọi thành phần. ví dụ:

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"); 
     } 
    } 
} 
+1

+1 cho khớp nối lỏng lẻo. – trashgod

+0

Cảm ơn bạn, giải pháp của bạn thực sự hữu ích! – user1002119

+0

@ user1002119: bạn được chào đón! Vui mừng nó đã giúp. –