JPanel的事件监听器,如果有多个JPanel,怎么不能内层处理完后,没有向上传递呢, 
比如: 
JPanel p1; 
JPanel p2; 
p1通过New对象将p2添加到p1中,现在p2中有个jComboBox控件,想把ItemStateChanged事件传到p1中,请问有什么办法么?

解决方案 »

  1.   

    panel1.add(new Panel2(panel1));将panel1做为panel2的构造函数的参数传递进去,这样就可以对panel1进行操作了。或者自己实现监听,从最外层开始添加自定义监听,一直到最里面,在嘴里面组件的监听中调用外面的方法,实际上也是依靠Java的事件监听来进行触发。
      

  2.   

    是我说的不够明确,是p1作为公共控件,分别被加入到另外的容器p2,p3中,p1中的jComboBox有ItemStateChanged事件,我现在想判断到底是P2中的还是p3中的在触发事件?
      

  3.   

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    public class EventText extends JFrame{ public EventText(){
    setSize(200,200);
    ParePanel panel1 = new ParePanel("Panel1");
    panel1.add(new ComPanel(panel1));
    getContentPane().add(panel1,BorderLayout.SOUTH);

    ParePanel panel2 = new ParePanel("Panel2");
    panel2.add(new ComPanel(panel2));
    getContentPane().add(panel2,BorderLayout.NORTH);
    }

    class ParePanel extends JPanel{
    String name;
    public ParePanel(String name){
    this.name = name;
    }

    public String getName(){
    return name;
    }
    }

    class ComPanel extends JPanel{
    JComboBox box;
    JPanel panel;
    public ComPanel(ParePanel compo){
    this.panel = compo;
    box = new JComboBox(new String[]{"Test"});
    box.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
    System.out.println("我是:" + panel.getName() + " 上的Combo。");
    }});
    setLayout(new BorderLayout());
    add(box);
    }
    }

    public static void main(String[] args){
    EventText frame = new EventText();
    frame.setVisible(true);
    }
    }
    运行结果:
    我是:Panel2 上的Combo。
    我是:Panel1 上的Combo。
      

  4.   

    那我如何在Panel1 或者Panel2上监听到这个事件呢?
      

  5.   

    这种情况下,最好还是自己封装一个JPanel,如果使用JPanel panel = new JPanel(); panel.add(...);添加组件很难处理的。        public ComPanel(ParePanel compo){
                this.panel = compo;
                box = new JComboBox(new String[]{"Test"});
                box.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("我是:" + panel.getName() + " 上的Combo。");
                        ((ParePanel)panel).调用相应的方法//对父组件的引用进行操作
                    }});
                setLayout(new BorderLayout());
                add(box);
            }
      

  6.   

    OK,自己搞定了,多谢gongfuliang 
      

  7.   

    还有个问题想问下,我如何分别获取panel1和panel2中comboBox的值?
      

  8.   

    还有个问题想问下,我如何分别获取panel1和panel2中comboBox的值?