1. ホーム
  2. java

[解決済み] JMenuItemにActionListenerを追加する

2022-02-10 08:06:07

質問

簡単なGUIプロジェクトを始めたところですが、メニューバーを作成しているときに、不可解なエラーに遭遇しました。私は ActionListenerJMenuItem を使って addActionListener を、これまでと同じように使っています。しかし、このメソッドを適用すると、Eclipseはエラーを出します: "Syntax error on token "addActionListener", = expected after this token." 私の唯一の考えは、おそらくは addActionListener がメソッドではなくプロパティとして解釈されているようです...しかし、過去にこのメソッドを使ったことがあるので、動作することは知っています。どの程度のコードを提供すればいいのか分からないので、もっと編集した方がいいのかどうか教えてください。

package com.movethehead;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

@SuppressWarnings("serial")
public class Main extends JFrame {

    private final int W = 500;
    private final int H = 500;

    JMenuBar menuBar = new JMenuBar();

    JMenu file = new JMenu("File");
    JMenuItem exitItem = new JMenuItem("Exit");
    exitItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ev) {
                System.exit(0);
        }
    });

    JMenu headMenu = new JMenu("Heads");
    JMenu bgMenu = new JMenu("Backgrounds"); 

    public Main() {
        setTitle("Move the Head");
        setSize(W, H);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        add(new Pnl());
        setJMenuBar(menuBar);
    } // end constructor

    public static void main( String[] args ) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Main f = new Main();
                f.setVisible(true);
        }
    });
} // end main()
} // end Main

解決方法は?

私には、次のように見えます。

JMenuBar menuBar = new JMenuBar();

JMenu file = new JMenu("File");
JMenuItem exitItem = new JMenuItem("Exit");
exitItem.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ev) {
            System.exit(0);
    }
});

JMenu headMenu = new JMenu("Heads");

はメソッド定義の外にあり、そのコードを呼び出す方法はありません。

これを試してみてください。

public class Main extends JFrame{

  //initialize integer height/width values along with declaring 
  //Swing component variables
  private final int W = 500,
                    H = 500;

  private JMenu file, headMenu, bgMenu;
  private JMenuBar menuBar;
  private JMenuItem exitItem;

  //constructor
  public Main(){
    setTitle("Move the Head");
    setSize(W, H);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);

    initializeElements();

  }

  //Initializes the elements, this part is missing from your code above.
  public void initializeElements(){

    menuBar = new JMenuBar();
    file = new JMenu("File");
    exitItem = new JMenuItem("Exit");

    exitItem.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ev) {
        System.exit(0);
      }
    });

    headMenu = new JMenu("Heads");
    bgMenu = new JMenu("Backgrounds");

  }

  public static void main( String[] args ) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            Main f = new Main();
            f.setVisible(true);
        }
    });
  }
}