【问题标题】:Communication between two JPanels两个 JPanel 之间的通信
【发布时间】:2012-12-20 14:33:43
【问题描述】:

我有这个带有 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);        
    }
}

面板 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 添加组件?

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

【问题讨论】:

    标签: java swing jpanel communication


    【解决方案1】:

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

    例如,请查看this answer 中的代码,或者更好的the answer to this question

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您应该知道这将组件紧密耦合。
      • 我再次强调:你应该知道这将组件紧密耦合!!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2019-03-26
      相关资源
      最近更新 更多