从按下的JMenuItem获取文本?

时间:2016-04-17 00:14:00

标签: java swing jmenu jmenuitem

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

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

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());
    }

} 

它的作用是从文本文件的每一行读取,并将其添加到JMenu,称为gameMenu。但是,我只能向JMenu添加actionlisteners,而不能添加JMenu的JMenuItem。在JFrame主空白中,我就是这样实现的:

public class index extends javax.swing.JFrame {

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

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

        initComponents();
        dd.addGameMenu(menuGame); 

    }

}

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

2 个答案:

答案 0 :(得分:3)

  

但是,我只能向JMenu添加actionlisteners,而不是JMenuItem,

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

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

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 );

答案 1 :(得分:2)

Camickr打败了我。

当您应该添加构造的JMenuItem时,您正在向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();
        });
    }

}