Java,如何从另一个 class 设置 JMenuItem 的文本?

Java, How Do I setText of JMenuItem from another class?

很遗憾我没有学过Java,我知道除了Java以外的其他编程语言。

我知道如何创建菜单并向菜单添加项目。我从我的简单基础 java 书籍中了解到这一点。但是,我可以访问一个开源软件,需要对其进行一些调整,使其适合我,但我被卡住了。因此,我将提供正在发生的事情的代码并提供我所拥有的代码,然后希望有人可以填补缺失的部分并解释它是如何工作的。

下面的代码是调用 TranslatorAction.java 的文件的一部分,它在创建新菜单项时在线调用它。我完全理解这部分。我只发布了这段代码,因此您可以看到没有为 JMenuItem 导入导入语句,并且菜单项是通过 menu.add 调用间接添加的。 adminMenu.add 正在通过创建对象来创建菜单项/class??使用参数 new 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);
    }

当从上面调用 new TranslatorAction() 以创建新菜单项时。我在访问新 JMenuItem 的设置文本时遇到问题。我通过玩代码知道 super("test");正在设置新的 JMenuItem 文本。我希望能够将它设置为一个变量,这样它就可以即时更改。下面是从上面用 adminMenu.add(New TranslatorAction());

调用的整个文件

TranslatorAction java 文件代码

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

感谢大家花时间帮助我。 肖恩

您可以使用 JMenuItem#setText(String) 方法动态设置 JMenuItems 文本。

不使用单独 类 的更简单的解决方案是创建您自己的 JMenuItem,使用 anonymous classes 设置其操作,并将其添加到 JMenu

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

请注意,如果您计划实施 MVC 模式(@MadProgrammer 和我强烈推荐),您对控制器的方法调用将在 actionPerformed(...) 方法。有关 MVC 模式的更多信息,请参阅 this answer.


如果您真的打算将 AbstractAction 添加到您的 JMenu,您将需要添加一种方式来提供 您的操作访问 JMenuItem 的实例,它将被添加到。

您可以使用 myJMenu.getItem(menu.getItemCount() - 1) 获得此 JMenuItem。这将获取 JMenu 中的最后一个 JMenuItemJMenuItemJMenu#add(Action a) 一起添加到 JMenu 的末尾,如文档中所述。

因为在调用 add(Action a) 之前无法创建 JMenuItem,要为您的自定义 AbstractAction 添加 JMenuItem 实例,您可以添加一个setter 方法 (setJMenuItem(JMenuItem item)) 到您的自定义操作。

我修改后的 AbstractAction 实现如下所示:

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

}

确保在添加操作后设置 JMenuItem 因为在这种情况下如果调用 actionPerformed(...) 方法并且 itemnull a NullPointerException 会被抛出。

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