两个jpanel之间的通信



我有这个"主"面板(我们叫它AAA)的BorderLayout,其中有两个面板(BBBCCC):

public class AAA extends JPanel {
    BBB pnlNorth = new BBB();
    CCC pnlCenter = new CCC();
    public AAA(){
        setLayout(new BorderLayout());
        add(pnlNorth,BorderLayout.NORTH);
        add(pnlCenter,BorderLayout.CENTER);        
    }
}

Panel CCC目前为空,带有GridLayout。

我的面板BBB看起来像这样:

public class BBB extends JPanel {
    public BBB (){
        JLabel labNum = new JLabel("Number of items: ");
        JTextField txtNum = new JTextField();
        JButton cmdOK = new JButton("OK");
        txtNum.setColumns(5);
        cmdOK.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                /* ???????????? */
            }
        });
        add(labNum);
        add(txtNum);
        add(cmdOK);        
    }
}

当用户在txtNum中输入数字并按"OK"时,面板CCC应填充适当的数据输入行数。每行应该包含两个文本字段、两个下拉列表和一个复选框。如果用户输入一些大的数字,那么如果所有的项都在JScrollPane中就好了。

我的问题:我应该如何在BBB中实现动作监听器?我不知道用户会输入什么数字。因此,我不知道CCC的GridLayout的确切行数(我只知道它应该有5列)。我可以从BBB中的监听器修改它的布局吗?如何从面板BBB中的监听器向面板CCC添加组件?

当然,如果你有更好的解决方案(不需要两个单独的面板),请告诉我:)

你可能想错了。最好不要考虑两个JPanel的在通信,而更简单地考虑两个对象在通信,它们将像任何其他两个对象一样进行通信——通过影响状态的方法。通过让一个对象调用另一个对象的方法并将其信息发布给另一个对象,可以将此信息从一个对象推送到另一个对象,或者通过使用观察者设计模式将其从一个对象拉到另一个对象,例如可以使用可用的各种侦听器之一来实现。我自己喜欢使用PropertyChangeListener。因此,被观察对象将接受侦听器,一旦其状态发生变化,侦听器就会收到通知,然后这些侦听器将调用被观察对象的公共方法来提取更改的信息。

例如,请查看这个答案中的代码,或者更好的是这个问题的答案

我做到了。我只是将Center面板作为参数传递给North面板的构造函数。效果很好。谢谢大家的回答:)

最新更新