Как заставить элемент JMenu делать что-то, когда он нажат
Я делаю GUI, который имеет Jmenu; у него есть элементы 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;
}
}
BTW: я хочу, чтобы опция веб-сайта (давайте просто работать с этим сейчас) использовала метод launchURL; я знаю, что завод.
3 ответов
A JMenuItem
является формой кнопки (AbstractButton
). Нормальный шаблон состоит в том, чтобы построить кнопку с Action
(см. JMenuItem
'конструктор ы). The Action
определяет имя и действие, которое будет выполнено. Большинство людей расширяют AbstractAction
и реализовать actionPerformed
, который вызывается при нажатии кнопки.
возможная реализация может выглядеть так:
JMenuItem menuItem = new JMenuItem(new AbstractAction("My Menu Item") {
public void actionPerformed(ActionEvent e) {
// Button pressed logic goes here
}
});
или:
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
}
}
обратите внимание, что все, что я сказал выше относится также к JButton
. Также принять посмотрите на Java очень полезно как использовать действия учебник.
вам просто нужно добавить ActionListener к вашему JMenuItem1 следующим образом:
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
а затем реализовать действие в jMenuItem1ActionPerformed (evt):
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
javax.swing.JOptionPane.showMessageDialog(null, "foo");
// more 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");
и:
private static void menuFileExitActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
для добавления любых действий в кнопку просто сделайте объект из класса, реализующего интерфейс ActionListener:
menuFileWebsite.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
launchURL("http://www.google.com");
}
});
здесь мы делаем анонимный внутренний объект, реализующий интерфейс Actionlistener, и переопределяем метод actionperforemed для выполнения его работы
Я делаю некоторые изменения в вашем коде, чтобы следовать стандарту java по классу именования и создавать любые компоненты GUI в 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");
}
}
}