繁体   English   中英

如何通过另一个面板更改CardLayout的面板

[英]how to change a panel of CardLayout through another panel

在我的程序中,我有一个基于向导的布局。 由CardLayout实现。 因此,存在一组扩展JPanels的类。 我想在每个面板中都有按钮以导航到其他面板。 例如,当程序显示第一个面板时,我想要一个按钮来显示第二个面板。

我很累在主cardlayout面板支架中创建一个方法,因此任何其他类都可以通过此方法更改显示面板,但是它不起作用并且出现stackoverflow错误。

这是我的课

基本框架:

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) {
        // TODO code application logic here
        new Base();
    }
}

包含子面板的主类:

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

    public MainPanel() {
        NewSession session = new NewSession();
        ChooseSource chooseSource = new ChooseSource();

        panelHolder.add(session, "Session");
        panelHolder.add(chooseSource, "ChooseSource");

        cl.show(panelHolder, "Session");
        add(panelHolder);
    }

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

子面板1

public class NewSession extends JPanel {
    MainPanel ob2 = new MainPanel();

    public NewSession(){
        JButton newSessionBTN = new JButton("Create A New Session");

        newSessionBTN.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                System.out.println("HI");

                ob2.showPanel("ChooseSource");
            }
        });

        add(newSessionBTN);
    }
}

子面板2

public class ChooseSource extends JPanel {

    public ChooseSource(){
        JLabel showMe = new JLabel("Show Me");
        JButton back = new JButton("Back");
        //MainPanel ob = new MainPanel();

        back.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                //ob.showPanel("start");
            }
        });

        add(back);
        add(showMe);
    }
}

如您所见,每个子面板中都有一个按钮,单击后这些按钮必须显示另一个面板。 稍后,他们还将数据从一个传输到另一个。

错误:

Exception in thread "main" java.lang.StackOverflowError
    at java.awt.Component.setFont(Component.java:1899)
    at java.awt.Container.setFont(Container.java:1748)
    at javax.swing.JComponent.setFont(JComponent.java:2751)
    at javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:208)
    at javax.swing.plaf.basic.BasicPanelUI.installDefaults(BasicPanelUI.java:66)
    at javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:56)
    at javax.swing.JComponent.setUI(JComponent.java:663)
    at javax.swing.JPanel.setUI(JPanel.java:153)
    at javax.swing.JPanel.updateUI(JPanel.java:126)
    at javax.swing.JPanel.<init>(JPanel.java:86)
    at javax.swing.JPanel.<init>(JPanel.java:109)
    at javax.swing.JPanel.<init>(JPanel.java:117)
    at InnerPanels.NewSession.<init>(NewSession.java:21)
    at StrongBaseLayout.MainPanel.<init>(MainPanel.java:22)

通过重复最后两行,错误会比这更长。

我该如何运作?

另外,我还有一个想法是在页面底部有一个下一个和上一个按钮来切换面板。 但是不确定哪一个是最佳的。 任何想法?

每当您看到意外的StackOverflowError总会寻找无意递归的存在,实际上,这正是您要执行的操作,因为MainPanel创建了NewSession对象,然后创建了新的MainPanel对象,然后又创建了新的NewSession对象,然后再创建了一个新的MainPanel对象....无限重复执行或直到堆栈内存(因此堆栈溢出)用完为止。

这里:

public class NewSession extends JPanel {
    MainPanel ob2 = new MainPanel();  // *****

和这里:

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

    public MainPanel() {
        NewSession session = new NewSession();  // *****

不要那样做 而是要小心地创建每个对象中的一个,并且只有一个。 使用setter方法或构造函数参数可以帮助您完成此任务。

例如,更改为:

public class NewSession extends JPanel {
    MainPanel ob2;

    NewSession(MainPanel mainPanel) {
       this.ob2 = mainPanel;

和这个:

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

    public MainPanel() {
        NewSession session = new NewSession(this);

关于:

另外,我还有一个想法是在页面底部有一个下一个和上一个按钮来切换面板。 但是不确定哪一个是最佳的。 任何想法?

我不确定你在这里是什么意思。 定义“最佳”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM