2012-03-19 160 views
8

我正在製作一個帶有Jmenu的GUI;它有jmenu項目,當點擊時會做些事情。那就是問題所在。我看了看,但我無法找到如何使它點擊時做一些事情。另外,我是一個noob,所以如果你能以非常簡單的方式做到這一點,那會很棒!如何讓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方法;我知道一個人可以工作。

回答

10

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

或:

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教程。

+0

好的,那麼我該怎麼做? – PulsePanda 2012-03-19 22:09:01

+0

['FileMenu'](http://stackoverflow.com/a/4039359/230513)是一個相關示例。 – trashgod 2012-03-19 22:09:24

+0

嗯,我看到如何可能是有用的,但我不明白如何實現它...我們可以使用我的代碼的一部分?請記住,我是一個nooby – PulsePanda 2012-03-19 22:17:08

2

你只需要一個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); 
} 
+0

使用Actions而不是actionListener()更好。動作具有可以重用的好處,並且如果禁用動作,則所有使用該動作的GUI元素也將被禁用。這也是更清潔的設計恕我直言。 – Michael 2012-03-22 15:23:51

1

對於添加任何行動統一到按鈕,只需從類使對象實現ActionListener接口:

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

在這裏我們使實現ActionListener接口的匿名內部對象,並覆蓋actionperforemed方法做它的工作

我在代碼中進行了一些更改,遵循關於命名類的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"); 
     } 
    } 
} 
相關問題