2

こんにちは皆さん私はmenuItemsを使用して各JPanelを制御できる簡単なプログラムを作成したかったのです。たとえば、[ファイル]-> [新規]を選択すると、[新規]はJmenuItemで、newPanelという名前のJPanelが表示されます。また、[編集]-> [編集]を選択すると、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そのままで2日目のみ変更。Stringフォーム内のパラメーター

于 2012-10-16T12:55:03.400 に答える
4

+1 に mKorbel (私を打ち負かしてください)

ただし、ここにあります:

  • が作成さsetVisibleれる前に呼び出さないでください。JFrame
  • setSize を使用しないで、適切なLayoutManagerまたはオーバーライドgetPreferredSizeを見つけますJComponent
  • インスタンスpack()の呼び出しJFrame
  • より効率的であるため、ステートメントではなく s (Java 7 から) でswitchブロックを使用します。Stringif
  • 不必要extendJFrame授業をしない

エラーの理由は次のとおりです。

  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 に答える