0

我不知道是什么问题?我尝试使用 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));
    }
}

然后我的OptionPanel,使用JButton jbtBack 回到MainPanel

public class OptionPanel extends JPanel{

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

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

1 回答 1

3

这里的代码将导致无限递归:

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

由于此构造函数最终是从 CardLayoutMenu 类调用的,因此您将拥有一个 CardLayoutMenu 对象,该对象创建一个 MainPanel 对象,该对象创建一个 CardLayoutMenu 对象,该对象创建一个 MainPanel 对象,该对象创建一个 CardLayoutMenu 对象,该对象创建一个 MainPanel 对象,该对象创建一个...... ,我想你明白了。

我强烈建议你的一个基本规则是不要让你的 GUI 类实现 Listener 接口,因为它要求类做太多事情,并且经常导致像你这样的混乱代码。这在小型示例程序中很好,但我希望它不被使用,因为它鼓励新手继续做这种事情。而是考虑创建一个 ActionListener 对象并将此侦听器传递给任何需要一个按钮的类,该按钮需要告诉 CardLayout 更改视图。您可以通过构造函数或 setter 方法参数将此侦听器传递给这些类。

于 2012-02-23T14:44:49.070 回答