2

大家好,我想创建一个简单的程序,在其中我可以使用 menuItems 控制每个 JPanel。例如,如果我选择 File->New,其中 New 是 JmenuItem,它将显示一个名为 newPanel 的 JPanel。此外,如果我选择 Edit->Edit,它将显示名为 editPanel 的 JPanel 以及添加到其中的对象。到目前为止,这就是我所构建的:

public class CardLayoutwithMenuBar extends JFrame implements ActionListener {

    private JMenuBar menu;
    private JMenu fileMenu;
    private JMenu editMenu;
    private JMenu exitMenu;

    private JMenuItem openItem;
    private JMenuItem newItem;
    private JMenuItem editItem;
    private JMenuItem exitItem;

    private JPanel newPanel;
    private JPanel openPanel;
    private JPanel editPanel;
    private JPanel exitPanel;

    static private CardLayout cardView;
    static private JPanel cardPanel;


    public CardLayoutwithMenuBar(){
        this.setVisible(true);
        this.setTitle("Controlling Different Panel Using CardLayout");
        this.setSize(400, 150);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create Menu bar and add to Frame
        menu = new JMenuBar();
        this.setJMenuBar(menu);

        fileMenu = new JMenu("File");
        editMenu = new JMenu("Edit");
        exitMenu = new JMenu("Exit");

        menu.add(fileMenu);
        menu.add(editMenu);
        menu.add(exitMenu);

        newItem = new JMenuItem("New File");
        openItem = new JMenuItem("File Open");
        editItem = new JMenuItem("Edit Entry");
        exitItem = new JMenuItem("Exit");

        fileMenu.add(newItem);
        fileMenu.add(openItem);
        editMenu.add(editItem);
        exitMenu.add(exitItem);

        //Declare object cardView and cardPanel and set layout of cardPanel to CardLayout
        cardView = new CardLayout();
        cardPanel = new JPanel();
        cardPanel.setLayout(cardView);


        //Create sub-panels that would correspond to each function in the menu item ex. newItem, openItem etc...
        newPanel = new JPanel();
        openPanel = new JPanel();
        editPanel = new JPanel();
        exitPanel = new JPanel();


        //add the sub-panels to the main cardpanel 
        cardPanel.add("New", newPanel);
        cardPanel.add("Open", openPanel);
        cardPanel.add("Edit",editPanel);
        cardPanel.add("Exit",exitPanel);

        newItem.addActionListener(this);
        openItem.addActionListener(this);
        editItem.addActionListener(this);
        exitItem.addActionListener(this);

        this.getContentPane().add(cardPanel, BorderLayout.CENTER);
    }

    public void actionPerformed(ActionEvent evt){
        String menuItemAction = evt.getActionCommand();

            if (menuItemAction.equals("New File")){
                cardView.show(newPanel, "New");
            }
            else if (menuItemAction.equals("File Open")){
                cardView.show(openPanel, "Open");
            }
            else if (menuItemAction.equals("Edit Entry")){
                cardView.show(editPanel, "Edit");
            }
            else if (menuItemAction.equals("Exit")){
                cardView.show(exitPanel, "Exit");
            }
            else{
                System.out.println("Opppsss you pressed something else");
        }
    }   
}

当我尝试运行这个程序时,我总是得到这个错误:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: wrong parent for CardLayout
    at java.awt.CardLayout.checkLayout(CardLayout.java:404)
    at java.awt.CardLayout.show(CardLayout.java:526)
    at com.JMenuSample.CardLayoutwithMenuBar.actionPerformed(CardLayoutwithMenuBar.java:132)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
.... and the list goes on

谁能帮我解决这个问题?提前致谢!

4

2 回答 2

4
  • 必须使用适当的方法CardLayout-public void show(Container parent, String name)

  • 然后使用cardView.show(cardPanel, "New"); (insted of cardView.show(newPanel, "New");)

  • 其余的newPanel as Container留下来,只改变第二次。String形式参数

于 2012-10-16T12:55:03.400 回答
4

+1 到 mKorbel(击败我)

但是这里是:

  • setVisible在创建之前不要调用JFrame
  • 不要使用 setSize 而是找到一个适当的LayoutManager或覆盖getPreferredSizeJComponent
  • 调用实例pack()_JFrame
  • 在 s 上使用switchString(来自 java 7)而不是if语句,因为它更有效
  • 不要不必要地extend上课JFrame

错误的原因在这里:

  if (menuItemAction.equals("New File")){
                cardView.show(newPanel, "New");
            }
            else if (menuItemAction.equals("File Open")){
                cardView.show(openPanel, "Open");
            }
            else if (menuItemAction.equals("Edit Entry")){
                cardView.show(editPanel, "Edit");
            }
            else if (menuItemAction.equals("Exit")){
                cardView.show(exitPanel, "Exit");
            }
            else{
                System.out.println("Opppsss you pressed something else");
        }

你的父母是你的cardPanel,而不是你想要显示的面板,这是由字符串参数给出的:

cardView.show(cardPanel, "New");

请参阅下面的更改代码:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class CardLayoutWithMenuBar implements ActionListener {

    private JMenuBar menu;
    private JMenu fileMenu;
    private JMenu editMenu;
    private JMenu exitMenu;
    private JMenuItem openItem;
    private JMenuItem newItem;
    private JMenuItem editItem;
    private JMenuItem exitItem;
    private JPanel newPanel;
    private JPanel openPanel;
    private JPanel editPanel;
    private JPanel exitPanel;
    private CardLayout cardView;
    private JPanel cardPanel;

    public CardLayoutWithMenuBar() {
        JFrame frame = new JFrame();
        frame.setTitle("Controlling Different Panel Using CardLayout");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        initComponents(frame);

        frame.pack();
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent evt) {

        String menuItemAction = evt.getActionCommand();

        switch (menuItemAction) {
            case "New File":
                cardView.show(cardPanel, "New");
                break;
            case "File Open":
                cardView.show(cardPanel, "Open");
                break;
            case "Edit Entry":
                cardView.show(cardPanel, "Edit");
                break;
            case "Exit":
                cardView.show(cardPanel, "Exit");
                break;
            default:
                System.out.println("Opppsss you pressed something else");
                break;
        }
    }

    private void initComponents(JFrame frame) {
        //Create Menu bar and add to Frame
        menu = new JMenuBar();
        frame.setJMenuBar(menu);

        fileMenu = new JMenu("File");
        editMenu = new JMenu("Edit");
        exitMenu = new JMenu("Exit");

        menu.add(fileMenu);
        menu.add(editMenu);
        menu.add(exitMenu);

        newItem = new JMenuItem("New File");
        openItem = new JMenuItem("File Open");
        editItem = new JMenuItem("Edit Entry");
        exitItem = new JMenuItem("Exit");

        fileMenu.add(newItem);
        fileMenu.add(openItem);
        editMenu.add(editItem);
        exitMenu.add(exitItem);

        //Declare object cardView and cardPanel and set layout of cardPanel to CardLayout
        cardView = new CardLayout();
        cardPanel = new JPanel(cardView);


        //Create sub-panels that would correspond to each function in the menu item ex. newItem, openItem etc...
        newPanel = new JPanel();
        openPanel = new JPanel();
        editPanel = new JPanel();
        exitPanel = new JPanel();


        //add the sub-panels to the main cardpanel 
        cardPanel.add("New", newPanel);
        cardPanel.add("Open", openPanel);
        cardPanel.add("Edit", editPanel);
        cardPanel.add("Exit", exitPanel);

        newItem.addActionListener(this);
        openItem.addActionListener(this);
        editItem.addActionListener(this);
        exitItem.addActionListener(this);

       frame.getContentPane().add(cardPanel, BorderLayout.CENTER);
    }

    public static void main(String... args) {

        //create frame and components on EDT
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                CardLayoutWithMenuBar cardLayoutWithMenuBar = new CardLayoutWithMenuBar();
            }
        });
    }
}
于 2012-10-16T13:04:40.777 回答