我在ProgramFrame内的JPanel的CardLayout中有两个JPanel(扩展了JFrame),它们是ChooserPanel和ShowPanel。

在ChooserPanel中,我选择一个显示在ShowPanel上的数字,然后单击一个按钮以更改ProgramFrame中的Panel,从ChooserPanel切换到ShowPanel。但是,如何优雅地将Button单击通知到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?) **/
    }

}

最佳答案

因此,您拥有视图并且拥有控制器。现在您需要模型。在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的对象中),或者用于双向通信,则使用相同的方法。

关于java - 在CardLayout中切换面板时如何警告面板可见,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23875937/

10-10 11:41