如何从一个单独的面板中更改CardLayout面板?(How to change CardLayou

2019-10-22 14:24发布

我的软件布局有点精灵基地。 所以基底面板被分成两个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"));
    }
}

这是一张图片给你的想法:

正如我所解释的,我可以通过使用该方法行进“从第一个”页面“第二页面”: mainPanel.showPanel("secondPage");mainPanel.showPanel("firstPage");

但我也有一个JButton左侧栏,我调用相同的方法来显示CardLayout的第二面板。 但是,这是行不通的。 它不给,虽然任何错误。

任何想法如何改变这些CardLayout从面板以外的面板?

Answer 1:

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

所以LeftBar执行mainPanel.showPanel("secondPage"); 上的第二个实例MainPanel其不是视觉层次的甚至一部分。 为了解决这个问题只需通过一个现有实例MainPanel到的构造LeftBar 。 你已经做到这一点在FirstPageSecondPage



文章来源: How to change CardLayout panels from a separate panel?