如何从单独的面板更改 CardLayout 面板?

How to change CardLayout panels from a separate panel?

我的软件布局有点基于向导。所以基本面板分为两个JPanel。一个永远不会改变的左面板。和一个与 CardLayout 一起使用的右侧面板。它有许多子面板,并通过一种方法显示每个子面板。

我可以轻松地从一个内部面板转到另一个内部面板。但我想在左侧面板中有一个按钮并在右侧更改面板。

这是一个示例代码,您可以 运行 它:

基地:

public class Base {
        JFrame frame = new JFrame("Panel");
        BorderLayout bl = new BorderLayout();

    public Base(){
        frame.setLayout(bl);
        frame.setSize(800, 600);
        frame.add(new LeftBar(), BorderLayout.WEST);
        frame.add(new MainPanel(), BorderLayout.CENTER);

        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        new Base();
    }
}

左侧

public class LeftBar extends JPanel{
    JButton button;
    MainPanel mainPanel = new MainPanel();

    public LeftBar(){
        setPreferredSize(new Dimension(200, 40));
        setLayout(new BorderLayout());
        setBackground(Color.black);

        button = new JButton("Show Second Page");
        button.addActionListener(new ActionListener(){
           @Override
           public void actionPerformed(ActionEvent ae) {
               mainPanel.showPanel("secondPage");
           }

       });

       add(button, BorderLayout.NORTH);
    }
}

右侧

public class MainPanel extends JPanel {
    private CardLayout cl = new CardLayout();
    private JPanel panelHolder = new JPanel(cl);

    public MainPanel(){
        FirstPage firstPage = new FirstPage(this);
        SecondPage secondPage = new SecondPage(this);

        setLayout(new GridLayout(0,1));

        panelHolder.add(firstPage, "firstPage");
        panelHolder.add(secondPage, "secondPage");

        cl.show(panelHolder, "firstPage");
        add(panelHolder);

    }
    public void showPanel(String panelIdentifier){
        cl.show(panelHolder, panelIdentifier);
    }
}

右侧的内面板:

public class FirstPage extends JPanel {
    MainPanel mainPanel;
    JButton button;

    public FirstPage(MainPanel mainPanel) {
       this.mainPanel = mainPanel;
       setBackground(Color.GRAY);

       button = new JButton("Show page");
       button.addActionListener(new ActionListener(){
           @Override
           public void actionPerformed(ActionEvent ae) {
               mainPanel.showPanel("secondPage");
           }

       });

       add(button);
    }
}



public class SecondPage extends JPanel{
    MainPanel mainPanel;
    JButton button;
    public SecondPage(MainPanel mainPanel){
       this.mainPanel = mainPanel;
        setBackground(Color.white);
       add(new JLabel("This is second page"));
    }
}

这张图片可以让你明白:

正如我所解释的,我可以使用以下方法将 "from first" 页面移动到 "second page"mainPanel.showPanel("secondPage");mainPanel.showPanel("firstPage");.

但我在左侧栏中也有一个 JButton,我调用相同的方法来显示 CardLayout 的第二个面板。但它不起作用。虽然它没有给出任何错误。

知道如何从面板外部更改这些 CardLayout 面板吗?

问题是 LeftBarmainPanel 成员初始化为 MainPanel 的新实例。所以你有两个 MainPanel 实例,一个在 Base 中分配并添加到框架中,另一个在 LeftBar 中分配。

所以 LeftBarMainPanel 的第二个实例上执行 mainPanel.showPanel("secondPage");,它甚至不是视觉层次结构的一部分。要解决此问题,只需将 MainPanel 的现有实例传递给 LeftBar 的构造函数即可。您已在 FirstPageSecondPage 中执行此操作。