不幸的是我没有学习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) {
}
}
感谢每一个人'是时候帮助我了。 肖恩
答案 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(...)
方法且item
为null
,则为NullPointerException
将被抛出。
final JMenu menu = new JMenu("Test JMenu");
final CustomAction action = new CustomAction();
menu.add(action);
action.setJMenuItem(menu.getItem(menu.getItemCount() - 1));