当前位置: 首页 > 知识库问答 >
问题:

从按下的JMenuItem获取文本?

王高超
2023-03-14

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

我在游戏菜单中有几个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。但是,我只能将actionlisteners添加到JMenu,而不能添加JMenuItem,即JMenu。在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个答案

宫修贤
2023-03-14

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

}
艾仲渊
2023-03-14

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

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

调用添加游戏菜单(…)之前 您可以创建一个ActionListener,供所有JMenuItems共享,代码如下:

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

然后,您可以更改您的addGameMenu(JMenu控件,ActionListener al)以获得第二个参数。

然后在您更改的方法中:

//control.add(split[i]);
JMenuItem menuItem = new JMenuItem( split[I] );
menuItem.addActionListener( al );
control.add( menuItem );
 类似资料:
  • 是否可以获取JMenuItem在其JMenu中的位置/索引? 例如,我有一个名为“Search”的JMenu和3个名为“Find”、“Count”和“Replace”的JMenuItems,我只有1个类管理器来管理所有3个JMenuItems。因此,我使用getSource()方法来获取单击了哪些JMenuItems,以便将JMenuItem的索引传递给另一个类的构造函数。 我的问题是,如果想添加

  • 目前正在学习我自己 JavaFX。 我使用场景生成器创建了一个带有按钮和文本字段的简单场景。 为什么我不能点击按钮,并从文本字段中获取文本? FXML代码是:

  • 我有一个包含注入和强制(最终)字段的类。对于common,我可以使用micronatBean factory . get bean(type)或BeanContext.getBean(type)从上下文中获取bean,但是在这种情况下,我必须传递类型和参数。 我为此创建了简单的测试 对象(bean)代码 当我运行它时,我收到异常 io . micro naut . context . except

  • 介绍 (Introduction) JMenuItem类表示菜单中的实际项目。 菜单中的所有项都应该来自JMenuItem类或其子类之一。 默认情况下,它包含一个简单的标签菜单项。 Class 声明 (Class Declaration) 以下是javax.swing.JMenuItem类的声明 - public class JMenuItem extends AbstractButton

  • 每个人我试图通过itext从PDF文件中获取一些带下划线的文本,这对我来说似乎非常困难。我已经搜索了很长时间的解决方案,并学习了如何获取文本的字体系列、字体大小和文本位置。但是,没有下划线。期待您的帮助!非常感谢。

  • 我有一个简单的Spring Boot微服务,负责向/从Google Cloud Storage上传、检索和删除图像。我的服务中的get请求有以下代码: 这是我的控制器部分: 就在响应中获取图像而言,这一切都很好,但我的问题是,图像也会下载到项目的根目录中。许多图像将通过此服务上载,因此这是一个问题。我只想在响应中显示图像,而不需要下载它们。我试着玩代码,但没能让它按我想要的那样工作。