Java 如何实现Button ActionListener以通过其他类运行cardLayout?
我不知道问题出在哪里?我试图通过使用JButton切换两个独立的类,扩展JPanel和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)
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