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

时间:2017-02-15 00:16:20

标签: java swing jmenu jmenuitem

不幸的是我没有学习Java,除了Java之外,我知道其他编程语言。

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

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

当从上面调用新的TranslatorAction()来创建新的菜单项时。我在访问新JMenuItem的文本设置时遇到问题。我知道从玩超线的代码(" 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) {
  }
  }

感谢每一个人'是时候帮助我了。 肖恩

1 个答案:

答案 0 :(得分:0)

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

不使用单独的类的更简单的解决方案是创建自己的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实例。

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

由于在调用JMenuItem之前无法创建add(Action a),因此要为自定义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,则为NullPointerException将被抛出。

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