7

JMenuBar の ActionListener について助けが必要です。

エラーはありません。ただし、JMenuItem をクリックするたびに、JMenuItem に関連付けられたすべてのアクションがトリガーされます。私の質問は、ActionListener コードで正しく実行していますか? 私の ActionListener クラスについてはよくわかりません。ActionListener を Button ロジックから分離しようとしています。

私が間違っているかもしれないことについて誰かが何か考えを持っているなら、それを指摘してください。

これが私のコードです:

package MenuBar;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class SimpleMenuBar{
    private static final LayoutManager grid = new GridLayout(0, 1);
    public JMenuBar MenuBar;
    public JMenu MenuFile, MenuEdit, MenuOption;
    public JMenuItem ItemNew, ItemOpen, ItemSave, ItemExit, ItemCopy, ItemCut, ItemPaste;
    ButtonGroup direction;
    JRadioButtonMenuItem forwardradio, backwardradio;
    JCheckBoxMenuItem CheckCase;
    String input = null;
    public void Design()
    {
        JFrame frame = new JFrame("Simple Menubar");
        frame.setSize(320, 320);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        MenuBar = new JMenuBar();
        frame.setJMenuBar(MenuBar);
        MenuBar.setLayout(grid);

        //Menus
        MenuFile = new JMenu("File");
        MenuFile.setMnemonic(KeyEvent.VK_F);
        MenuBar.add(MenuFile);

        //sub Menus
        ItemNew = new JMenuItem("New", KeyEvent.VK_N);
        MenuFile.add(ItemNew);
        ItemNew.setActionCommand("New");
        ItemNew.addActionListener(new MenuBarMethod());

        ItemOpen = new JMenuItem("Open", KeyEvent.VK_O);
        MenuFile.add(ItemOpen);
        ItemOpen.setActionCommand("Open");
        ItemNew.addActionListener(new MenuBarMethod());
        MenuFile.addSeparator();


        ItemSave = new JMenuItem("Save", KeyEvent.VK_S);
        MenuFile.add(ItemSave);
        MenuFile.addSeparator();

        ItemExit = new JMenuItem("Exit", KeyEvent.VK_X);
        MenuFile.add(ItemExit);

        MenuEdit = new JMenu("Edit");
        MenuFile.setMnemonic(KeyEvent.VK_E);
        MenuBar.add(MenuEdit);

        ItemCopy = new JMenuItem("Copy", KeyEvent.VK_C);
        KeyStroke ctrlCKeyStroke = KeyStroke.getKeyStroke("control C");
        ItemCopy.setAccelerator(ctrlCKeyStroke);
        MenuEdit.add(ItemCopy);

        ItemCut = new JMenuItem("Cut", KeyEvent.VK_V);
        KeyStroke ctrlVKeyStroke = KeyStroke.getKeyStroke("control V");
        ItemCut.setAccelerator(ctrlVKeyStroke);
        MenuEdit.add(ItemCut);

        ItemPaste = new JMenuItem("Paste", KeyEvent.VK_Y);
        KeyStroke ctrlYKeyStroke = KeyStroke.getKeyStroke("control Y");
        ItemPaste.setAccelerator(ctrlYKeyStroke);
        ItemPaste.setEnabled(false);
        MenuEdit.add(ItemPaste);
        MenuEdit.addSeparator();

        MenuOption = new JMenu("Option");
        Icon atIcon = new ImageIcon("option.png");
        MenuOption.setIcon(atIcon);
        MenuOption.setMnemonic(KeyEvent.VK_O);

        direction = new ButtonGroup();
        forwardradio = new JRadioButtonMenuItem("Forward Me", true);
        forwardradio.setMnemonic(KeyEvent.VK_F);
        MenuOption.add(forwardradio);
        direction.add(forwardradio);
        MenuEdit.add(MenuOption);

        backwardradio = new JRadioButtonMenuItem("Backward Me");
        backwardradio.setMnemonic(KeyEvent.VK_B);
        MenuOption.add(backwardradio);
        direction.add(backwardradio);

        MenuOption.addSeparator();

        CheckCase = new JCheckBoxMenuItem("Case Sensitive");
        MenuOption.add(CheckCase);
        direction.add(CheckCase);
        MenuEdit.add(MenuOption);

    }
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable(){
            public void run()
            {
                SimpleMenuBar MyMenu = new SimpleMenuBar();
                MyMenu.Design();

            }
        });
    }
}

メニュー バーだけでも、非常に多くのコードです。ActionListener を完全には実装していません。テスト目的で、私は と の 2 つの項目に対してのみ実装しましItemNewItemOpenItemNew残念ながら、メニュー項目をクリックするたびに、ItemNew ItemOpenの両方のアクションがトリガーされます。

私のアクションリスナーのコードは次のとおりです。

package MenuBar;
import java.awt.event.*;

import javax.swing.JOptionPane;
public class MenuBarMethod implements ActionListener{
    public void actionPerformed(ActionEvent e)
    {
        if("New".equals(e.getActionCommand())){
            JOptionPane.showMessageDialog(null, "Selected Item: " + e.getActionCommand());
        }
        if("Open".equals(e.getActionCommand())){
            JOptionPane.showMessageDialog(null, "Selected Item: " + e.getActionCommand());
        }
    }

}
4

2 に答える 2

11

個人的な好みの問題として、私はAction APIを使用することを好みます

主な理由は次のとおりです。

  • 名前、キーストローク、ショートカット、アイコンなど、特定のアクションに関連付けられたロジックを一元化します
  • 再利用可能です。オブジェクトを作成する方がはるかに簡単でAction、メニュー項目とツールバー項目とポップアップ メニュー項目を再作成する必要があります。
  • これは、他の Swing コンポーネントによって十分にサポートされています。APIをサポートするほとんどの Swing コンポーネントは、一般に(など)もActionListener提供する手段を提供します。ActionJMenu.add(Action)JMenu(Action)
  • これにより、コードが読みやすくなり、クラスの単一のActionPerformedメソッドを読みやすくなり、複数のステートメントActionをざっと読んでみることが容易になりますif

アクションの使用方法をご覧ください

私見では

于 2012-08-16T03:25:23.943 に答える
3

の代わりにのgetSourceメソッドを使用します。ActionEventgetActionCommand

public class MenuBarMethod implements ActionListener{
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == ItemNew){
            JOptionPane.showMessageDialog(null, "Selected Item: " + e.getActionCommand());
        }
        if(e.getSource() == ItemOpen){
            JOptionPane.showMessageDialog(null, "Selected Item: " + e.getActionCommand());
        }
    }
}
于 2013-05-18T19:34:37.577 に答える