我有这个“主”面板(让我们称之为 AAA )和BorderLayout,以及两个面板( BBB 和 CCC ) :
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中输入一个数字并按“OK”时,面板 CCC 应填入适当数量的行以进行数据输入。每行应包含两个文本字段,两个下拉列表和一个复选框。如果用户输入一些大数字,那么所有项目都在JScrollPane中会很好。
我的问题:我应该如何在 BBB 中实现动作侦听器?我不知道用户输入的是什么号码。因此,我不知道 CCC 的GridLayout中的确切行数(我只知道它应该有5列)。我可以在 BBB 中从监听器修改其布局吗?如何从面板 BBB 中的监听器向面板 CCC 添加组件?
当然,如果您有更好的解决方案(没有两个单独的面板),请告诉我:)
答案 0 :(得分:7)
你可能会想到这个错误。或许最好不要考虑两个正在通信的 JPanel ,而是更简单地说两个正在通信的对象,它们将与任何其他两个对象进行通信 - - 通过影响状态的方法。通过让一个对象调用另一个对象的方法并将其信息发布给另一个对象,可以将该信息从一个对象推送到另一个对象,或者可以通过使用观察者设计模式将其从一个对象拉到另一个对象。与各种可用的听众之一。我自己,我喜欢使用PropertyChangeListener。因此,观察对象将接受在状态发生变化后通知的侦听器,然后这些观察者将调用观察者的公共方法来提取已更改的信息。
例如,请查看this answer中的代码,或者更好the answer to this question。