我不是问题所在吗?我尝试通过使用JButton来切换两个单独的类以及使用cardLayout扩展JPanel,我不知道我使用的是正确的代码...
这是我的编码。
CardLayoutMenu
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));
}
}
然后是我的OptionPanel,使用JButton jbtBack返回MainPanel
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对象,该对象创建一个CardLayoutMenu对象,该对象创建一个MainPanel对象,该对象创建一个CardLayoutMenu对象,该对象创建一个创建一个MainPanel对象的对象,该对象创建一个... ,我认为您已经知道了。
我强烈敦促您执行的一项基本规则是,不要让您的GUI类实现侦听器接口,因为它要求类做过多的工作,并且经常导致混淆您的代码。在小型示例程序中,这很好,但是我希望它没有被使用,因为它鼓励新手继续做这种事情。相反,可以考虑创建一个ActionListener对象,并将此侦听器传递给需要一个需要告诉CardLayout更改视图的按钮的任何类。您可以通过构造函数或setter方法参数将此侦听器传递给这些类。