2012-03-19 3 views
8

Я создаю графический интерфейс с Jmenu; у него есть элементы 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. Также взгляните на очень полезный учебник How to Use Actions Java.

+0

ОК, так как я могу это сделать? – PulsePanda

+0

['FileMenu'] (http://stackoverflow.com/a/4039359/230513) - пример. – trashgod

+0

hmmmm, я вижу, как это может быть полезно, но я не понимаю, как его реализовать ... можно ли использовать часть моего кода? имейте в виду, im a nooby – PulsePanda

2

Вам просто нужно добавить ActionListener своим JMenuItem1 так:

jMenuItem1.addActionListener(new java.awt.event.ActionListener() { 
    public void actionPerformed(java.awt.event.ActionEvent evt) { 
     jMenuItem1ActionPerformed(evt); 
    } 
}); 

, а затем осуществлять действия в jMenuItem1ActionPerformed (ЭВТ):

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, использующие это действие, также будут отключены. Это также намного более чистый дизайн IMHO. – Michael

1

Для добавления каких-либо действий в кнопку, просто сделать объект из класса, которые реализуют 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"); 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^