当前位置: 首页 > 知识库问答 >
问题:

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

佴德曜
2023-03-14

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

我试图在main cardlayout panel holder中创建一个方法,以便任何其他类都可以通过该方法更改显示面板,但它不起作用,并且出现了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)

通过重复最后两行,错误要比这个长。

我怎样才能让它工作?

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

共有1个答案

高宇定
2023-03-14

每当你看到一个意外的堆栈溢出错误时,一定要注意是否存在不经意的递归,事实上,这正是你在这里要做的,因为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);

关于:

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

我不知道你在这里是什么意思。定义“最优”。

 类似资料:
  • 问题内容: 我用Google搜索了很多东西,但没有找到解决方案。我认为应该有Java大师来帮助我… 这是我的初始化方法: 这是JPanel另一个步骤0的方法: 完全没有任何回应,我尝试过重新验证,重新粉刷和其他工作人员…不起作用…任何人在这里都可以得到意见! 问题答案: 这就是将正确的方法和常量String暴露给外界,以允许类交换视图本身。例如,给您的第一堂课一个私有的CardLayout字段,称

  • 我正在创建一个代码,在那里我需要改变面板的颜色,当我通过它时,我仍然按在上面。例如,假设我按下一个绿色面板,然后拖动它到另一个面板上,这个面板应该是绿色的。然而,它并不是每次都起作用,就像有时它会改变颜色,但有时它不会。 这是Carre的代码(法语为正方形) 我不明白的是为什么它有时会起作用,我不知道问题是否来自我如何做我的拖拽事件,或者是其他地方出了问题。 谢谢你的雨篷。

  • 我有一个CardLayout,由许多不同的JPanels组成,我可以随意显示。该GUI链接到后端,并且GUI的目的是允许用户操作存储在后端中的数据。 问题是,当用户更改后端中的一些数据时,我的JLabels没有反映该数据中的更改。我明白这是因为JLabels初始化了一次,当我更新它们初始化到的变量时,我必须再次调用setText,以便它们体验更改。 示例:我的JLabel是如何初始化的 问题是,当

  • 问题内容: 我创建了一个框架,然后在其中创建了面板。我已经将图像放置在一个 面板中,现在我需要将该图像拖动到另一个面板中。我该怎么做。 请作为初学者逐步说明。 问题答案: 使用纯Java的快速示例DragGestureListener,DropTargetAdapter并 TransferHandler为一个面板上的图像对另一面板的DnD支持: 选择绿色形状并将其拖动到上方的空白面板后:

  • 问题内容: 我试图用来显示两个,一个主菜单和一个控件屏幕。当我将两张卡片添加到卡中时,它只会显示两张闪烁的图像。这是我的代码: MazeGamePanel: 公共类MazeGamePanel扩展了JPanel实现Runnable { } MazeControlsPanel: 包装屏幕; 问题答案: 这是一个问题: 不要在Swing程序中使用java.util.Timer,因为您会遇到线程问题。而是

  • 问题内容: 因此,我最近开始涉足OOP,到目前为止一切进展顺利。虽然我本身没有任何问题,但我希望有一个令人惊奇的功能,尽管我找不到关于该功能的任何文档。 在为对象分配属性时,我经常发现我必须更改依赖于他人的属性,例如光明与黑暗。这是一个例子: 现在,尽管这很酷,但我想要的是相同的过程,但是如果一个属性发生更改,则在同一对象内。如果我重置光的属性(是的),我希望黑暗相应地增加/减少。如果可以更改光的