Java 如何实现Button ActionListener以通过其他类运行cardLayout?

Java 如何实现Button ActionListener以通过其他类运行cardLayout?,java,swing,actionlistener,cardlayout,Java,Swing,Actionlistener,Cardlayout,我不知道问题出在哪里?我试图通过使用JButton切换两个独立的类,扩展JPanel和cardLayout,我不知道我使用的代码是否正确。。。 这是我的代码 卡片布局菜单 public class CardLayoutMenu extends JFrame implements ActionListener{ CardLayout cardLayout = new CardLayout(); private JPanel p1 = new JPanel(cardLayout)

我不知道问题出在哪里?我试图通过使用JButton切换两个独立的类,扩展JPanel和cardLayout,我不知道我使用的代码是否正确。。。 这是我的代码

卡片布局菜单

public class CardLayoutMenu extends JFrame implements ActionListener{

    CardLayout cardLayout = new CardLayout();

    private JPanel p1 = new JPanel(cardLayout);

    final String MAIN = "MAIN";
    final String OPTION = "OPTION";

    MainPanel mainPanel = new MainPanel();
    OptionPanel optionPanel = new OptionPanel();

    private Object object;

    public CardLayoutMenu(Object object) {          
        this.object = object;
    }

    public CardLayoutMenu(){

        setLayout(new BorderLayout());
        setTitle("Card Layout Menu");
        setSize(300,300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        setLocationRelativeTo(null);            
        add(p1);            
        p1.add(mainPanel, MAIN);
        p1.add(optionPanel, OPTION);
    }

    public void actionPerformed(ActionEvent e){

        try{
            cardLayout.show(p1, OPTION);
        }catch(Exception ex){
            System.out.println("" + ex);
        }
    }
}
这是我的主面板

public class MainPanel extends JPanel{

    private JButton jbtOption = new JButton("Option");

    public MainPanel() {            
        setLayout(new FlowLayout());
        add(jbtOption);         
        jbtOption.addActionListener(new CardLayoutMenu(this));
    }
}
public class OptionPanel extends JPanel{

    private JButton jbtBack = new JButton("Back");

    public OptionPanel() {          
        setLayout(new FlowLayout());
        add(jbtBack);           
    }
}
然后我的选项面板,使用JButton jbtBack返回主面板

public class MainPanel extends JPanel{

    private JButton jbtOption = new JButton("Option");

    public MainPanel() {            
        setLayout(new FlowLayout());
        add(jbtOption);         
        jbtOption.addActionListener(new CardLayoutMenu(this));
    }
}
public class OptionPanel extends JPanel{

    private JButton jbtBack = new JButton("Back");

    public OptionPanel() {          
        setLayout(new FlowLayout());
        add(jbtBack);           
    }
}

此代码将导致无限递归:

public MainPanel() {
  setLayout(new FlowLayout());
  add(jbtOption);
  jbtOption.addActionListener(new CardLayoutMenu(this));
}
由于此构造函数最终是从CardLayoutMenu类调用的,因此您将拥有一个CardLayoutMenu对象,该对象创建一个MainPanel对象,该对象创建一个MainPanel对象,该对象创建一个CardLayoutMenu对象,该对象创建一个MainPanel对象,该对象创建一个。。。我想你明白了


我强烈要求您遵守的一条基本规则是不要让GUI类实现侦听器接口,因为这会要求类执行太多操作,并且经常会导致像您这样的代码混乱。这在小示例程序中有点不错,但我希望不要使用它,因为它鼓励新手继续做这种事情。相反,请考虑创建ActualListNever对象,并将此侦听器传递到需要按钮的任何类,该按钮需要告诉CARDePayress更改视图。您可以通过构造函数或setter方法参数将此侦听器传递到这些类中。

此代码将导致无限递归:

public MainPanel() {
  setLayout(new FlowLayout());
  add(jbtOption);
  jbtOption.addActionListener(new CardLayoutMenu(this));
}
由于此构造函数最终是从CardLayoutMenu类调用的,因此您将拥有一个CardLayoutMenu对象,该对象创建一个MainPanel对象,该对象创建一个MainPanel对象,该对象创建一个CardLayoutMenu对象,该对象创建一个MainPanel对象,该对象创建一个。。。我想你明白了


我强烈要求您遵守的一条基本规则是不要让GUI类实现侦听器接口,因为这会要求类执行太多操作,并且经常会导致像您这样的代码混乱。这在小示例程序中有点不错,但我希望不要使用它,因为它鼓励新手继续做这种事情。相反,请考虑创建ActualListNever对象,并将此侦听器传递到需要按钮的任何类,该按钮需要告诉CARDePayress更改视图。您可以通过构造函数或setter方法参数将此侦听器传递到这些类中。

那么…具体是什么问题?我不确定您是如何尝试使用此侦听器的,但CardLayoutMenu在实例化时会创建一个MainPanel实例。而主面板在实例化时会创建一个CardLayoutMenu。这只能导致堆栈溢出…这是无限递归的好例子!我只想单击其他JPanel类中的按钮,告诉JFrame类中的cardLayout更改视图。那么…具体是什么问题呢?我不确定您是如何尝试使用它的,但是CardLayoutMenu在实例化时会创建一个MainPanel实例。而主面板在实例化时会创建一个CardLayoutMenu。这只能导致堆栈溢出…这是无限递归的好例子!我只想单击其他JPanel类中的按钮,并告诉JFrame类中的cardLayout更改视图。因此,我必须在CardLayoutMenu类中创建内部类ActionListener,并创建一个构造函数getButtonObject,以从MainPanel和OptionPanel获取JButton对象??那么我应该如何在MainPanel和OptionPanel中为JButton添加ActionListener??jbtOption.addActionListener(新的CardLayoutMenu.ButtonListener())\n aSo我必须在CardLayoutMenu类中创建内部类ActionListener,并创建一个构造函数getButtonObject,以从MainPanel和OptionPanel获取JButton对象??那么我应该如何在MainPanel和OptionPanel中为JButton添加ActionListener??jbtOption.addActionListener(新的CardLayoutMenu.ButtonListener())\n a