2016-04-17 18 views
0

Derzeit verwenden wir SWING, um eine JMenuBar zu implementieren, wo es zwei verschiedene JMenus gibt. Einer heißt gameMenu und einer heißt addMenuGame.Den Text von einem gedrückten JMenuItem abrufen?

Ich habe mehrere JMenuItems in gameMenu, die alle mit dieser Methode implementiert sind, in meinem Interface-Controller.

public void addGameMenu(JMenu control) { 
    String fileName = "gamemodes.txt"; 
    try { 

     FileReader inputFile = new FileReader(fileName); 

     BufferedReader bufferReader = new BufferedReader(inputFile); 

     String line; 

     while ((line = bufferReader.readLine()) != null) { 

      String split[] = line.split("#"); 
      for (int i = 0; i < split.length; i++) { 
       control.add(split[i]); 
      } 

     } 

     bufferReader.close(); 
    } catch (Exception e) { 
     System.out.println("Fejl ved linje:" + e.getMessage()); 
    } 

} 

, was es tut, wird jede Zeile aus einer Textdatei zu lesen, und fügt hinzu, dass auf die JMenu, gameMenu genannt. Allerdings kann ich dem JMenu nur ActionListen hinzufügen, und nicht JMenuItem, also JMenu. Im JFrame Haupt Leere, das ist, wie ich es umsetzen:

public class index extends javax.swing.JFrame { 

    QuizzControlHandler dd = new QuizzControlHandler(); 
    private JMenuItem dc; 

    /** 
    * Creates new form index 
    */ 
    public index(){ 

     initComponents(); 
     dd.addGameMenu(menuGame); 

    } 

} 

Das wird mein Menü richtig füllen, jedoch muss ich abrufen, was der Benutzer auf klickt.

Antwort

3

Allerdings kann ich nur actionlisteners zum JMenu, fügen und nicht die JMenuItem,

Der Benutzer klickt auf der JMenuItem so müssen Sie die ActionListener zum NICHT der JMenu JMenuItem hinzuzufügen.

Bevor Sie rufen die addGameMenu(...) Sie können eine ActionListener schaffen wie von allen JMenuItems mit Code geteilt werden:

ActionListener al = new ActionListener() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     JMenuItem menuItem = (JMenuItem)e.getSource(); 
     System.out.println(menuItem.getText()); 
    } 
} 

Dann würden Sie Ihre addGameMenu(JMenu control, ActionListener al) ändern, um einen zweiten Parameter zu haben.

dann in der Methode, die Sie ändern:

//control.add(split[i]); 
JMenuItem menuItem = new JMenuItem(split[I]); 
menuItem.addActionListener(al); 
control.add(menuItem); 
+0

Ich kann dir nicht genug Bruder danken, auf Punkt mit dieser Erklärung ... Vielen Dank! –

2

Camickr es schlug mich.

Sie fügen einfache Zeichenfolgen zu Ihrem JMenu hinzu, wenn Sie konstruierte JMenuItems hinzufügen sollten. Mit anderen Worten: Fügen Sie dem Menü keine dummen Objekte hinzu, wenn Sie intelligente Objekte hinzufügen können. Zum Beispiel:

import java.awt.event.ActionEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class TestMenus extends JPanel { 
    public TestMenus() { 

    } 

    public void addGameMenu(JMenu control) { 

     String[] texts = { "One", "Two", "Three", "Four", "Five" }; 
     for (int i = 0; i < texts.length; i++) { 
      control.add(new JMenuItem(new MenuItemAction(texts[i]))); 
     } 
    } 

    private class MenuItemAction extends AbstractAction { 
     public MenuItemAction(String name) { 
      super(name); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Menu item: " + e.getActionCommand()); 
     } 
    } 

    private static void createAndShowGui() { 
     TestMenus mainPanel = new TestMenus(); 

     JMenu menu = new JMenu("Menu"); 
     mainPanel.addGameMenu(menu); 
     JMenuBar menuBar = new JMenuBar(); 
     menuBar.add(menu); 

     JFrame frame = new JFrame("TestMenus"); 
     frame.setJMenuBar(menuBar); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 

} 
+0

Schätze es Bruder, doof Fehler von meiner Seite, nur dachte, es gab einen einfacheren Weg, J Items von einem JMenu zu bekommen, angenommen, es war nicht so einfach. Danke sehr, Bruder! –

Verwandte Themen