3

您好,我试图从事件侦听器中启用我的 JMenuItem,但它似乎超出了范围。我是 Java 新手,所以我将如何正确处理这个问题。所述事件侦听器将更改为新视图并启用禁用的菜单项。

    //Create and add MenuItems
    JMenuItem fileItem0 = new JMenuItem("Load");
    collMenu.add(fileItem0);

    JMenuItem fileItem1 = new JMenuItem("Add");
    fileItem1.setEnabled(false);
    collMenu.add(fileItem1);

    JMenuItem fileItem2 = new JMenuItem("Delete");
    fileItem2.setEnabled(false);
    collMenu.add(fileItem2);

    //Add Menu bar to frame
    menubar.add(collMenu);

    //Menu Item Functions
    fileItem0.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent actionEvent) {
            JOptionPane.showMessageDialog(null,"You selected: Load.");
            //Enable fileitem1 & 2 here ?? 
        }
    });
4

3 回答 3

8

我希望这个小例子能帮助你消除疑惑......

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MenuExample extends JFrame {
    JMenuBar menuBar = new JMenuBar();
    JMenu menu = new JMenu("File");
    JMenu menu1 = new JMenu("Edit");
    JMenuItem item1 = new JMenuItem("New");
    JMenuItem item2 = new JMenuItem("Open");

    public MenuExample() {
        setJMenuBar(menuBar);
        setVisible(true);
        setSize(400, 200);
        menuBar.add(menu);
        menuBar.add(menu1);
        menu.add(item1);
        menu.add(item2);
        item1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JFileChooser chooser = new JFileChooser();
                chooser.showOpenDialog(null);

            }

        });
        item2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JFileChooser chooser = new JFileChooser();
                chooser.showOpenDialog(null);

            }

        });

    }

    public static void main(String[] args) {
        MenuExample ex = new MenuExample();
    }

}
于 2012-09-22T11:11:06.853 回答
1

不要在同一方法中声明这些菜单项(fileitem1 和 fileitem2)。只需在您的方法之外声明您的 fileitem1 和 fileitem2 即可。

这解决了你的问题...

于 2012-09-22T11:23:24.837 回答
1

JMenuItem将您尝试访问的sfinal改为从内部类 ( addActionListener(new ActionListener() {...}) 中访问。

内部类需要 JMenuItem在内部访问ActionListener 才能是最终的。为了避免匿名委托引用的 java 变量中的闭包产生奇怪的副作用。

这是一个例子:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().createAndShowUI();
            }
        });
    }

    private void createAndShowUI() {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initComponents(frame);
        frame.pack();
        frame.setVisible(true);
    }

    private void initComponents(JFrame frame) {
        JMenuBar menuBar = new JMenuBar();

        JMenu menu1 = new JMenu("File");

        JMenuItem itemLoad = new JMenuItem("Load");
        //delcare them as final to be accessed from within an inner class
        final JMenuItem itemAdd = new JMenuItem("Add");
        final JMenuItem itemDel = new JMenuItem("Del");

        itemAdd.setEnabled(false);
        itemDel.setEnabled(false);

        itemLoad.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                itemAdd.setEnabled(true);
                itemDel.setEnabled(true);
            }
        });

        menu1.add(itemLoad);
        menu1.add(itemAdd);
        menu1.add(itemDel);
        menuBar.add(menu1);
        frame.setJMenuBar(menuBar);
    }
}
于 2012-09-22T11:31:02.010 回答