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)
方法动态设置 JMenuItem
s 文本。
不使用单独 类 的更简单的解决方案是创建您自己的 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
中的最后一个 JMenuItem
。 JMenuItem
与 JMenu#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(...)
方法并且 item
是 null
a NullPointerException
会被抛出。
final JMenu menu = new JMenu("Test JMenu");
final CustomAction action = new CustomAction();
menu.add(action);
action.setJMenuItem(menu.getItem(menu.getItemCount() - 1));
很遗憾我没有学过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)
方法动态设置 JMenuItem
s 文本。
不使用单独 类 的更简单的解决方案是创建您自己的 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
中的最后一个 JMenuItem
。 JMenuItem
与 JMenu#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(...)
方法并且 item
是 null
a NullPointerException
会被抛出。
final JMenu menu = new JMenu("Test JMenu");
final CustomAction action = new CustomAction();
menu.add(action);
action.setJMenuItem(menu.getItem(menu.getItemCount() - 1));