从按下的 JMenuItem 获取文本?

Getting the text from a JMenuItem that is pressed?

目前正在使用 SWING 实现一个 JMenuBar,其中有 2 个不同的 JMenus。一种叫gameMenu,一种叫addMenuGame。

我在gameMenu中有几个JMenuItem,在我的界面控制器中都是用这个方法实现的。

public void addGameMenu(JMenu control) {
    String fileName = "gamemodes.txt";
    try {

        FileReader inputFile = new FileReader(fileName);

        BufferedReader bufferReader = new BufferedReader(inputFile);

        String line;

        while ((line = bufferReader.readLine()) != null) {

            String split[] = line.split("#");
            for (int i = 0; i < split.length; i++) {
                control.add(split[i]);
            }

        }

        bufferReader.close();
    } catch (Exception e) {
        System.out.println("Fejl ved linje:" + e.getMessage());
    }

} 

它的作用是从文本文件中读取每一行,并将其添加到名为 gameMenu 的 JMenu 中。但是,我只能将动作监听器添加到 JMenu,而不是 JMenu 的 JMenuItem。在 JFrame main void 中,我是这样实现的:

public class index extends javax.swing.JFrame {

    QuizzControlHandler dd = new QuizzControlHandler();
    private JMenuItem dc;

    /**
     * Creates new form index
     */
    public index(){

        initComponents();
        dd.addGameMenu(menuGame); 

    }

}

这将正确填充我的菜单,但是,我需要检索用户单击的内容。

However, I can only add actionlisteners to the JMenu, and not the JMenuItem,

用户单击 JMenuItem,因此您需要将 ActionListener 添加到 JMenuItem 而不是 JMenu。

在调用 addGameMenu(...) 之前,您可以创建一个 ActionListener 以供所有 JMenuItems 共享,代码如下:

ActionListener al = new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        JMenuItem menuItem = (JMenuItem)e.getSource();
        System.out.println(menuItem.getText());
    }
}

然后您将 addGameMenu(JMenu control, ActionListener al) 更改为具有第二个参数。

然后在方法中你改成:

//control.add(split[i]);
JMenuItem menuItem = new JMenuItem( split[I] );
menuItem.addActionListener( al );
control.add( menuItem );

Camickr 先于我。

当您应该添加构造的 JMenuItems 时,您却在向 JMenu 添加简单的字符串。换句话说,当您可以添加智能对象时,不要将愚蠢的对象添加到菜单中。例如:

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

@SuppressWarnings("serial")
public class TestMenus extends JPanel {
    public TestMenus() {

    }

    public void addGameMenu(JMenu control) {

        String[] texts = { "One", "Two", "Three", "Four", "Five" };
        for (int i = 0; i < texts.length; i++) {
            control.add(new JMenuItem(new MenuItemAction(texts[i])));
        }
    }

    private class MenuItemAction extends AbstractAction {
        public MenuItemAction(String name) {
            super(name);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Menu item: " + e.getActionCommand());
        }
    }

    private static void createAndShowGui() {
        TestMenus mainPanel = new TestMenus();

        JMenu menu = new JMenu("Menu");
        mainPanel.addGameMenu(menu);
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(menu);

        JFrame frame = new JFrame("TestMenus");
        frame.setJMenuBar(menuBar);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }

}