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

时间:2015-04-12 22:28:01

标签: java swing oop layout-manager cardlayout

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

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

以下是您可以运行它的示例代码:

BASE:

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"));
    }
}

这是给你一个想法的图片: enter image description here

正如我解释的那样,我可以使用此方法"从第一个" 页面到"第二页" :{ {1}}或mainPanel.showPanel("secondPage");

但是我在左侧栏中也有一个mainPanel.showPanel("firstPage");,我用同样的方法来显示CardLayout的第二个面板。但它不起作用。它虽然没有给出任何错误。

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

1 个答案:

答案 0 :(得分:4)

问题在于LeftBar已将mainPanel成员初始化为MainPanel的新实例。因此,您有两个MainPanel个实例,一个在Base中分配并添加到框架中,另一个在LeftBar中分配。

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