6

我有这个带有 BorderLayout 的“主”面板(我们称之为AAA)和两个面板(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 中输入一个数字并按“确定”时,面板CCC应填充适当数量的数据输入行。每行应包含两个文本字段、两个下拉列表和一个复选框。如果用户输入一些较大的数字,如果所有项目都在 JScrollPane 中,那就太好了。

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

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

4

2 回答 2

7

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

例如,请查看此答案中的代码,或者甚至更好地查看此问题的答案

于 2013-01-06T20:23:53.263 回答
1

我设法做到了。我只是在 North 面板的构造函数中将 Center 面板作为参数传递。它完美地工作。谢谢大家的回答:)

于 2013-01-06T20:59:24.373 回答