2017-02-15 7 views
-2

Leider habe ich Java nicht gelernt, ich kenne andere Programmiersprachen mit Ausnahme von Java.Java, Wie setze ich Text von JMenuItem von einer anderen Klasse?

Ich weiß, wie man ein Menü erstellt und Elemente zum Menü hinzufügt. Das habe ich aus meinen einfachen Java-Basisbüchern herausgefunden. Allerdings habe ich Zugriff auf ein Stück Open-Source-Software und muss einige Verbesserungen vornehmen, damit es für mich funktioniert und ich feststecke. Also werde ich Code von dem, was vor sich geht, zur Verfügung stellen und Code von dem, was ich habe, geben und hoffentlich kann jemand die fehlenden Teile ausfüllen und erklären, wie es funktionierte, so wie es funktionierte.

Der folgende Code ist Teil der Datei, die TranslatorAction.java aufruft. Sie ruft sie in der Zeile auf, wenn ein neuer Menüeintrag erstellt wird. Ich verstehe diesen Teil vollständig. Ich habe diesen Code nur gepostet, damit Sie sehen können, dass die Importanweisung nicht für JMenuItem importiert wird und dass der Menüeintrag indirekt vom Aufruf menu.add hinzugefügt wird. Der adminMenu.add erstellt den Menüeintrag, indem er ein Objekt/eine Klasse erstellt ?? mit den paremeters neuen TranslatorAction

javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import com.bo.actions.TranslatorAction; 
    private void createAdminMenu(JMenuBar menuBar) { 
    JMenu adminMenu = new JMenu(com.POSConstants.ADMIN); 
    adminMenu.add(new TranslatorAction()); 
    menuBar.add(adminMenu); 
    } 

Wenn neue TranslatorAction() aus der oben für die Erstellung des neuen Menüpunkt aufgerufen wird. Ich habe ein Problem beim Zugriff auf die Einstellung des Textes für das neue JMenuItem. Ich weiß vom Spielen mit dem Code, dass die Zeile super ("test"); setzt den neuen JMenuItem-Text. Ich möchte in der Lage sein, dies auf eine Variable zu setzen, so dass es im laufenden Betrieb geändert werden kann. Unten ist die ganze Datei, die von oben aufgerufen wird mit adminMenu.add (New TranslatorAction());

TranslatorAction Java-Datei Code

package com.bo.actions; 
    import java.awt.event.ActionEvent; 
    import javax.swing.AbstractAction; 
    import javax.swing.Icon; 
    import javax.swing.JTabbedPane; 
    import com.POSConstants; 
    import com.bo.ui.BackOfficeWindow; 


    public class TranslatorAction extends AbstractAction { 

    public TranslatorAction(){ 
    //I know this sets the JMenuItem to Test. Again no importing of  
    //JMenuItem at all what so ever. But I need to set the JmenuItem 
    //to something on the fly instead of hard coding it. Can anyone 
    //show and explain how to dynamically create/change super("test"), 
    // so that way it is not hard coded? 

    super("Test"); 
    } 

    public TranslatorAction(String name) { 
    super(name); 
    } 

    public TranslatorAction(String name, Icon icon) { 
     super(name, icon); 
    } 

    public void actionPerformed(ActionEvent e) { 
    } 
    } 

Vielen Dank für jedes Mal, diejenigen, für mich zu helfen. Shawn

+2

Bitte bearbeiten Sie Ihre Frage, um ein vollständiges Beispiel zu geben. Insbesondere sollten alle Methoden innerhalb einer Klasse sein. Sie sollten auch den Einzug korrigieren. –

+0

Auch ich verstehe nicht, was Sie genau fragen. Sie sollten in Ihrem Beispiel zeigen, wo Sie Code hinzufügen müssen, den Sie nicht kennen. –

+0

Ich habe den Code mit dem, was ich verstehe und was ich ändern muss, kommentiert. die Linie super ("Test"); ist was ich ändern muss. Diese Zeile, die ich kenne, ändert den Text im Dateimenü. Also wenn ich es in super ("java") ändere; Das Dateimenü wird Java enthalten. Ich muss das dynamisch ändern können. Also ich denke, was ich wissen muss, ist nicht der Code, um es dynamisch zu ändern, aber was muss ich tun, um auf setText für das JMenuItem zuzugreifen, das aus dem Aufruf der anderen Klasse adminMenu.add (new translatorAction()) erstellt wird; –

Antwort

0

Sie können einen JMenuItem s-Text mit der JMenuItem#setText(String)-Methode dynamisch festlegen.

Eine einfachere Lösung, ohne separate Klassen zu verwenden, wäre, Ihre eigene JMenuItem zu erstellen, ihre Aktion mit anonymous classes festzulegen und sie zur JMenu hinzuzufügen.

final JMenu menu = new JMenu("Test JMenu"); 
final JMenuItem menuItem = new JMenuItem("Initial Text"); 
menuItem.setAction(new AbstractAction() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     menu.setText("Different Text"); 
    } 

}); 
menu.add(menuItem); 

Beachten Sie, wenn Sie bei der Umsetzung der MVC-Muster planen (Welcher @MadProgrammer und ich sehr empfehlen kann), Ihr Methodenaufruf an die Steuerung in der actionPerformed(...) Methode wäre. Weitere Informationen zum MVC-Muster finden Sie unter this answer.


Wenn Sie wirklich auf das Hinzufügen eines AbstractAction zu Ihrem JMenu gesetzt sind, Sie gehen zu müssen, einen Weg addieren Ihre Aktion Zugriff auf eine Instanz des JMenuItem geben, es hinzugefügt werden, geht zu .

Sie können diese JMenuItem mit erhalten. Dies erhält die letzte JMenuItem in der JMenu. JMenuItem s, die mit der JMenu#add(Action a) hinzugefügt werden, werden am Ende der JMenu hinzugefügt, wie in der Dokumentation angegeben.

Da es keine Möglichkeit, die JMenuItem bis nach dem Aufruf von add(Action a) erstellt zu bekommen, Ihren benutzerdefinierten AbstractAction das JMenuItem Beispiel zu geben, können Sie eine Setter-Methode (setJMenuItem(JMenuItem item)), um Ihre benutzerdefinierte Aktion hinzuzufügen.

Meine überarbeitete AbstractAction Implementierung sieht wie folgt aus:

public class CustomAction extends AbstractAction { 

    private JMenuItem item; 

    public CustomAction() { 
     super("Initial Text"); 
    } 

    public void setJMenuItem(JMenuItem item) { 
     this.item = item; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     item.setText("Different Text"); 
    } 

} 

Achten Sie auf die JMenuItem ein, nachdem Sie die Aktion, weil in diesem Fall hinzufügen, wenn die actionPerformed(...) Methode aufgerufen wird und item ist null ein NullPointerException wird geworfen werden.

final JMenu menu = new JMenu("Test JMenu"); 
final CustomAction action = new CustomAction(); 
menu.add(action); 
action.setJMenuItem(menu.getItem(menu.getItemCount() - 1)); 
+0

Vielen Dank. Ich werde es versuchen. Der einzige Grund für separate Klassen und die Verwendung von AbstractAction besteht darin, im Stil des ursprünglichen Codes zu bleiben. Der gesamte Originalcode legt jedoch den Text des JMenuItem fest, indem er die menu.add (new class()) aufruft und dann in der neuen Klasse das angezeigte JMenuItem mit SUPER ("Display Name Of Menu Item") erstellt. Und ich habe viel durch verschiedene Bücher gelesen, die ich über Java geschrieben habe, und sie alle gehen in die grundlegenden Details über JMenuItem und die JMenu-Klassen, aber nicht genug, um es zusammenzufügen. –

+0

2 Bücher, von denen ich lerne, sind Deitel und Deitel Java. Wie man Covers Swing und Ivor Hortons Anfang Java 2 programmiert. Jedoch geht keines von ihnen in die Tiefe mit einigen der Dinge, die ich wissen oder versuchen muss, zum Beispiel herauszufinden . Ich weiß, wie man das macht, ohne separate Klassen zu verwenden, aber ich möchte den Stil des ursprünglichen Autors beibehalten. Wenn es noch andere gute oder bessere Java-Ressourcenbücher gibt als ich benutze, lass es mich auch wissen. –

+0

Nicht nur für mich, aber andere lesen auch. Da meine ursprüngliche separate Klassendatei das JMenuItem nicht importiert, gehe ich davon aus, dass ich das importieren muss, damit dies funktioniert? Wenn ich kompiliere, erhalte ich einen Fehler KANN FINDEN NICHT SYMBOL JMenuItem. –

Verwandte Themen