如何使用CardLayout,以菜单的操作侦听器?(How to use CardLayout, w

2019-10-23 00:34发布

我想换一个JFrame的JPanel中,使用CardLayout类。 我已经运行了这个例子,它的工作原理。

现在我要为动作侦听器,对应的JMenuItem使用; 所以如果我按那个JMenuItem的,我想改变它,与特定的面板。 因此,这是JFrame中:

public class FantaFrame extends JFrame implements Observer {

    private static final long serialVersionUID = 1L;
    private JPanel cardPanel = new JPanel();
    private CardLayout cardLayout = new CardLayout();

    public FantaFrame(HashMap<String, JPanel> fantaPanels) {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("FantaCalcio App");
        setSize(500, 500);
        cardPanel.setLayout(cardLayout);
        setPanels(fantaPanels);

    }

    public void update(Observable o, Object arg) {
        cardLayout.show(cardPanel, arg.toString());
    }

    private void setPanels(HashMap<String, JPanel> fantaPanels) {
        for (String name : fantaPanels.keySet()) {
            cardPanel.add(fantaPanels.get(name), name);
        }
    }
}

这些都是菜单时,控制器和主:

    private void pressed(){
        home.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                controller.changePanel(home.getText());
            }
        });
    }
   public class Controller extends Observable {


    public void changePanel(String panel){
        setChanged();
        notifyObservers(panel);
    }
}
    public static void main(String[] args) {
        fantaPanels.put("Login", new LoginPanel());
        Controller controller = new Controller();
        MenuBarApp menuApp = new MenuBarApp(controller);
        FantaFrame frame = new FantaFrame(fantaPanels);
        frame.setJMenuBar(menuApp);
        controller.addObserver(frame);
        frame.setVisible(true);
    }

问题是,JPanel中不会改变。 你认为是什么问题? 我已经调试它,并在update()方法,正确的字符串值到达。

Answer 1:

你永远不添加CardPanel都JPanel中,使用CardLayout和显示“卡”到任何东西的人。 你需要将它添加到你的JFrame的contentPane中为它显示任何内容。 即

public FantaFrame(HashMap<String, JPanel> fantaPanels) {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("FantaCalcio App");
    setSize(500, 500);
    cardPanel.setLayout(cardLayout);
    add(cardPanel, BorderLayout.CENTER); // ****** add this line ******
    setPanels(fantaPanels);
}


文章来源: How to use CardLayout, with Menu as action listener?