How to make a JMenu item do something when it's clicked
A JMenuItem
is a form of a button (AbstractButton
). The normal pattern is to construct your button with an Action
(see JMenuItem
's constructor). The Action
defines the name and action to be performed. Most people extend AbstractAction
and implement actionPerformed
which is invoked when the button is pressed.
A possible implementation might look like:
JMenuItem menuItem = new JMenuItem(new AbstractAction("My Menu Item") {
public void actionPerformed(ActionEvent e) {
// Button pressed logic goes here
}
});
or:
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
}
}
Note that everything I said above also applies to JButton
. Also take a look at Java's very helpful How to Use Actions tutorial.
Although it is better to use Actions, you can also add an ActionListener to your JMenuItem1 like this:
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
and then implement the action in jMenuItem1ActionPerformed(evt):
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
javax.swing.JOptionPane.showMessageDialog(null, "foo");
// more code...
}
For your code:
...
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");
and:
private static void menuFileExitActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
For adding any actions into button, just make object from class that implement ActionListener interface:
menuFileWebsite.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
launchURL("http://www.google.com");
}
});
here we make anonymous inner object that implement Actionlistener interface, and override actionperforemed method to do its work
i make some changes in your code, to follow java standard on naming class, and create any GUI components in EDT.
// WindowMakerDemo.java
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.*;
public final class WindowMakerDemo {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("*Game Title* Beta 0.0.1");
frame.setSize(600, 400);
frame.setLocation(100, 100);
frame.setResizable(false);
frame.setVisible(true);
}
});
}
}
final class MyFrame extends JFrame{
public MyFrame() {
createWindow();
}
private void createWindow() {
setJMenuBar(menuBarCreator());
add(setTitle());
}
private 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");
// website button action
menuFileWebsite.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
launchURL("http://www.google.com");
}
});
// exit action
menuFileExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
// 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;
}
private Component setTitle() {
JLabel title = new JLabel("Welcome To *the game*");
title.setVerticalAlignment(JLabel.TOP);
title.setHorizontalAlignment(JLabel.CENTER);
return title;
}
private 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");
}
}
}