【问题标题】:How to make a JMenu item do something when it's clicked单击时如何使 JMenu 项执行某些操作
【发布时间】:2012-03-19 22:02:41
【问题描述】:

我正在制作一个带有 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;
}

}

顺便说一句:我希望网站选项(让我们暂时使用它)使用 launchURL 方法;我知道一个可行。

【问题讨论】:

    标签: java swing user-interface jmenu jmenuitem


    【解决方案1】:

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

    或:

    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 非常有用的 How to Use Actions 教程。

    【讨论】:

    • hmmmm,我知道这很有用,但我不明白如何实现它......我们可以使用我的部分代码吗?请记住,我是菜鸟
    • 是否有必要为每个单独的按钮创建一个类?必须有更好更有效的方法来做到这一点。
    【解决方案2】:

    虽然使用 Actions 更好,但您也可以像这样向 JMenuItem1 添加一个 ActionListener:

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

    【讨论】:

    • 使用 Actions 比使用 actionListener() 好得多。动作的好处是它们可以被重用,如果你禁用一个动作,所有使用该动作的 GUI 元素也会被禁用。恕我直言,这也是更清洁的设计。
    【解决方案3】:

    要在按钮中添加任何动作,只需从实现 ActionListener 接口的类中创建对象:

    menuFileWebsite.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            launchURL("http://www.google.com");
        }
    });
    

    这里我们创建实现 Actionlistener 接口的匿名内部对象,并重写 actionperformed 方法来完成它的工作

    我对您的代码进行了一些更改,以遵循 java 命名类标准,并在 EDT 中创建任何 GUI 组件。

    // 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");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多