如何使JMenu项目在单击时执行某些操作

Pul*_*nda 13 java user-interface swing jmenuitem jmenu

我正在制作一个有Jmenu的GUI; 它有点击时会做的jmenu项目.那就是问题所在.我看了看,但我找不到如何让它在点击时做点什么.此外,我是一个菜鸟,所以如果你能以一种非常简单的方式做到这一点,那就太棒了!

这是代码:

import java.awt.Color;
import java.awt.Component;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.*;

public abstract class windowMaker extends JFrame implements ActionListener {
private JMenu menuFile;

public static void main(String[] args) {
    createWindow();

}

public static void createWindow() {
    JFrame frame = new JFrame();
    frame.setTitle("*Game Title* Beta 0.0.1");
    frame.setSize(600, 400);
    frame.setLocation(100, 100);
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setJMenuBar(windowMaker.menuBarCreator());
    frame.add(windowMaker.setTitle());
}

public static void launchURL(String s) {
    String s1 = System.getProperty("os.name");
    try {

        if (s1.startsWith("Windows")) {
            Runtime.getRuntime()
                    .exec((new StringBuilder())
                            .append("rundll32   url.dll,FileProtocolHandler ")
                            .append(s).toString());
        } else {
            String as[] = { "firefox", "opera", "konqueror",   "epiphany",
                    "mozilla", "netscape" };
            String s2 = null;
            for (int i = 0; i < as.length && s2 == null; i++)
                if (Runtime.getRuntime()
                        .exec(new String[] { "which", as[i]   }).waitFor() == 0)
                    s2 = as[i];

            if (s2 == null)
                throw new Exception("Could not find web browser");
            Runtime.getRuntime().exec(new String[] { s2, s });
        }
    } catch (Exception exception) {
        System.out
                .println("An error occured while trying to open the            web browser!\n");
    }
}

public static  JMenuBar menuBarCreator() {
    // create the menu parts
    JMenuBar menuBar = new JMenuBar();
    JMenu menuFile = new JMenu("File");
    JMenu menuHelp = new JMenu("Help");
    JMenuItem menuFileWebsite = new JMenuItem("Website");
    JMenuItem menuFileExit = new JMenuItem("Exit");
    JMenuItem menuHelpRules = new JMenuItem("Rules");
    JMenuItem menuHelpAbout = new JMenuItem("About");
    JMenuItem menuHelpHow = new JMenuItem("How To Play");

    // make the shortcuts for the items
    menuFile.setMnemonic(KeyEvent.VK_F);
    menuHelp.setMnemonic(KeyEvent.VK_H);

    // put the menu parts with eachother
    menuBar.add(menuFile);
    menuBar.add(menuHelp);
    menuFile.add(menuFileWebsite);
    menuFile.add(menuFileExit);
    menuHelp.add(menuHelpRules);
    menuHelp.add(menuHelpAbout);
    menuHelp.add(menuHelpHow);


    return menuBar;
}

public static Component setTitle() {
    JLabel title = new JLabel("Welcome To *the game*");
    title.setVerticalAlignment(JLabel.TOP);
    title.setHorizontalAlignment(JLabel.CENTER);
    return title;
}

}
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我想要网站选项(现在让我们使用它)来使用launchURL方法; 我知道一个有效.

Ste*_*Kuo 14

A JMenuItem是按钮(AbstractButton)的一种形式.正常模式是使用Action(参见JMenuItem构造函数)构造您的按钮.该Action定义的名称和要执行的操作.大多数人都会扩展AbstractAction并实现actionPerformed按下按钮时调用的内容.

可能的实现可能如下所示:

JMenuItem menuItem = new JMenuItem(new AbstractAction("My Menu Item") {
    public void actionPerformed(ActionEvent e) {
        // Button pressed logic goes here
    }
});
Run Code Online (Sandbox Code Playgroud)

要么:

JMenuItem menuItem = new JMenuItem(new MyAction());
...
public class MyAction extends AbstractAction {
    public MyAction() {
        super("My Menu Item");
    }

    public void actionPerformed(ActionEvent e) {
        // Button pressed logic goes here
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我上面说的一切也适用于JButton.另请参阅Java非常有用的" 如何使用操作"教程.


Cos*_*lis 5

虽然最好使用 Actions,但您也可以将 ActionListener 添加到 JMenuItem1,如下所示:

jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jMenuItem1ActionPerformed(evt);
    }
});
Run Code Online (Sandbox Code Playgroud)

然后在 jMenuItem1ActionPerformed(evt) 中实现操作:

private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    javax.swing.JOptionPane.showMessageDialog(null, "foo");
    // more code...
}
Run Code Online (Sandbox Code Playgroud)

对于您的代码:

    ...
    JMenuItem menuFileWebsite = new JMenuItem("Website");
    JMenuItem menuFileExit = new JMenuItem("Exit");
    menuFileExit.addActionListener(new java.awt.event.ActionListener() {
        @Override
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            menuFileExitActionPerformed(evt);
        }
    });
    JMenuItem menuHelpRules = new JMenuItem("Rules");
Run Code Online (Sandbox Code Playgroud)

和:

private static void menuFileExitActionPerformed(java.awt.event.ActionEvent evt) {
    System.exit(0);
}
Run Code Online (Sandbox Code Playgroud)