java - 无法更改 Java Swing CardLayout 中的卡片

标签 java swing jpanel layout-manager cardlayout

我有一个名为 AddAccounts 的类

class AddAccounts extends JPanel {

    JPanel panelCont; //Panel deck
    CardLayout cl;

    public AddAccounts() {

             panelCont=new JPanel();
             cl = new CardLayout();
             panelCont.setLayout(cl);//set Panel Layout to CardLayout
            setPreferredSize(new Dimension(1013, 513));//Set Default Size

    /* Add Panels to the main window or integrate the panels*/
            panelCont.add(new Panel1(), "1");
            panelCont.add(new Panel2(),"2");
            panelCont.add(new Panel3(),"3");
            cl.show(panelCont, "1");
            add(panelCont);    
        }

    public void goNext() {
       cl.show(panelCont, "2");
      // cl.nxet(panelCont);
        System.out.println("method called"); //for debugging purpose
         }

    public void showFirstPanel(){
        cl.show(panelCont, "1");
         }  
}

还有两个名为Panel1 和 panel2() 的外部(单独文件)类。我想在 panel1 中按下按钮时更改卡片(从 panel1 到 panel2),这就是为什么我创建上面列出的名为 goNext() 的方法, 但问题是我无法更换卡。这是我如何尝试在 Panel1 中调用 goNext() 方法

@Override
public void actionPerformed(ActionEvent event) {
    if (event.getSource() == nextBtn) {
        setMainCategory((String)mainCat.getSelectedItem());
    }
}
public void setMainCategory(String mainCategory){
    this.mainCategory=mainCategory;
   new AddAccounts().goNext();
    //System.out.println("From set Method: "+this.mainCategory);
}

一切正常,System.out.println("方法调用");//出于调试目的被执行并打印在控制台窗口上,但面板(卡)不会改变。 请帮助..如何使其工作。

@haraldK 你说的完全正确。但这对我没有帮助,我试图实现的概念是我有一个名为 mainPanel 的 JFrame,在 mainPanel 中我有一个 JSplitPanel JSplitPane rootPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, userPanel, mainContentPane); mainContentPane 组成

JTabbedPane mainContentPane = new JTabbedPane(); mainContentPane.setPreferredSize(new Dimension(900, 550)); mainContentPane.setTabPlacement(JTabbedPane.TOP); mainContentPane.addTab("您的数据库", new UserRecords()); mainContentPane.addTab("Add Accounts", new AddAccounts());//这里是AddAccounts JPanel mainContentPane.addTab("更新现有数据", new EditRecords()); mainContentPane.setSelectedIndex(1);

我将按钮放置在Panel1、Panel2 上,而不是将按钮放置在父框架AddAccounts 上。这里的 goNext 方法属于 AddAccounts,当在 Panel1 中按下按钮时,我想访问它来更改面板(从 1 到 2)。我无法直接调用 goNext() 方法,因为它是 AddAccounts 类的方法而不是 Panel1。和 new AddAccounts().goNext(); 没有帮助 目录结构: 我的包 -UserPanel(MainPanelFrame,userPanelJPanel,mainContentPaneTabbedPane) -添加帐户(goNext()) -Panel1(下一个Btn) -Panel2 (nextBtn)

最佳答案

问题不是 CardLayout 代码,而是 setMainCategory 方法:

new AddAccounts().goNext();

每次调用该方法时,您都会创建一个 AddAccounts 的新实例。面板在此实例上翻转(这就是您看到调试输出的原因),但组件从未添加到父级(如 JFrameJPanel),因此从未显示过。方法退出后,生成的组件将被丢弃。

相反,您需要向父组件添加一个 AddAccounts,并且在 setMainCategory 方法中,只需调用 goNext()在这个例子中。

这是一个功能齐全的程序,演示了我上面试图解释的所有内容:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;

public class CardLayoutTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("CardLayoutTest");
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

                frame.getContentPane().add(new AddAccounts()); // Create single instance here
                frame.pack();
                frame.setLocationRelativeTo(null);

                frame.setVisible(true);
            }
        });
    }

    static class AddAccounts extends JPanel {

        JPanel panelCont; //Panel deck
        CardLayout cl;

        public AddAccounts() {
            panelCont = new JPanel();
            cl = new CardLayout();
            panelCont.setLayout(cl);//set Panel Layout to CardLayout

            /* Add Panels to the main window or integrate the panels*/
            panelCont.add(new ColorPanel(Color.ORANGE), "1");
            panelCont.add(new ColorPanel(Color.GRAY), "2");
            panelCont.add(new ColorPanel(Color.DARK_GRAY), "3");

            cl.show(panelCont, "1");

            add(panelCont);

            add(new JButton(new AbstractAction("First") {
                @Override
                public void actionPerformed(ActionEvent e) {
                    showFirstPanel();
                }
            }));
            add(new JButton(new AbstractAction("Next") {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // This method is similar to your setMainCategory
                    goNext();
                }
            }));
        }

        public void goNext() {
//            cl.show(panelCont, "2");
            cl.next(panelCont); // Allows iterating through all panels
            System.out.println("method called"); //for debugging purpose
        }

        public void showFirstPanel() {
            cl.show(panelCont, "1");
        }

        /// Dummy class to show that page flipping works
        private class ColorPanel extends JPanel {
            public ColorPanel(Color background) {
                setOpaque(true);
                setBackground(background);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 200);
            }
        }
    }
}

关于java - 无法更改 Java Swing CardLayout 中的卡片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37113581/

相关文章:

Java正则表达式匹配以固定标签开头的多行记录

java - 当选择一个值时,在 JComboBox 中仅显示一个值

java - 如何创建包含文本框和绘画组件的 JFrame?

java - 如何在 Java 中处理 Apache Mina SSHD SFTP 服务器中的传入文件

java - 使用 settings.xml 解决 sbt 的 java Artifact

java - 模拟继承的 protected 方法

java - JPanel repaint() 调用不起作用

java - 在 swing 中显示 HTML5

java - 添加没有 JPanel 的组件是正确的事情

java - jPanel 和 jButton 自定义