如何在CardLayout中切换面板时提醒面板它是否可见

时间:2014-05-26 18:32:54

标签: java swing cardlayout

我在 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?) **/
    }

}

1 个答案:

答案 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的对象中)或用于双向通信,则使用相同的方法。