从按下的 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();
});
}
}
目前正在使用 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();
});
}
}