我在 JPanel CardLayout 中有两个 JPanel > 在我的 ProgramFrame (扩展 JFrame )中,它们是 ChooserPanel 和 ShowPanel 。
在 ChooserPanel 中,我选择一个数字显示在 ShowPanel ,然后点击 按钮 更改 ProgramFrame 中的 面板 ,从 ChooserPanel 切换到 ShowPanel 。但是,我怎样才能优雅地通知 按钮 点击 ProgramFrame ,以便它可以切换 JPanel ,并将选择的号码传达给 ShowPanel ?
我在 ChooserPanel 中放置侦听器,以通知按钮点击 ProgramFrame 。如果这是最好的方式,那么我只需要知道如何将选择的号码传达给 ShowPanel 。
我考虑过做以下事情:
public class ProgramFrame extends JFrame implements SwitchThePanelListener {
private JPanel cardPanel;
public ProgramFrame() {
this.cardPanel = new JPanel();
ChooserPanel chooser = new ChooserPanel(this); // passing the listener
ShowPanel show = new ShowPanel();
cardPanel.add(chooser, "chooser");
cardPanel.add(show, "show");
CardLayout layout = (CardLayout) cardPanel.getLayout();
layout.show(cardPanel, "chooser");
/** Code to set and show the layout **/
}
public void switchThePanelListener() {
CardLayout layout = (CardLayout) cardPanel.getLayout();
layout.show(cardPanel, "chooser");
}
}
侦听器的代码:
public interface SwitchThePanelListener {
public void switchThePanelListener();
}
ChooserPanel :
public class ChooserPanel extends JPanel {
public ChooserPanel(SwitchThePanelListener listener) {
/** Code to set the layout and button to fire the listener **/
}
}
ShowPanel :
public class ChooserPanel extends JPanel {
public ChooserPanel() {
/** Code to set the layout to show the number (how?) **/
}
}
答案 0 :(得分:1)
所以你有视野,你有控制器。现在你需要模型。在JGoodies lib中,您可以找到一个好的界面:ValueModel。它看起来像
public interface ValueModel {
Object getValue();
void setValue(Object o);
void addPropertyChangeListener(PropertyChangeListener pl);
void removePropertyChangeListener(PropertyChangeListener pl);
}
您的控制器实例化ValueModel(JGoodies中的标准实现是ValueHolder)并将(集合)传输到两个面板。按钮单击后,ChooserPanel将值设置到模型中,ShowPanel注册一个侦听器以获取有关值更改的通知。如果在面板之间传输多个属性(只需将所有这些值组合在一个将设置为ValueModel的对象中)或用于双向通信,则使用相同的方法。