首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JMenuItem构造函数中声明未初始化的JMenuItem[] ()项

在JMenuItem构造函数中声明未初始化的JMenuItem[] ()项
EN

Stack Overflow用户
提问于 2019-09-17 09:14:38
回答 3查看 60关注 0票数 1

我有这样的代码:

代码语言:javascript
复制
JMenuItem itemA;
JMenuItem itemB;
JMenuItem itemC;
JMenuItem[] items = {itemA, itemB, itemC};

我想要做的是在JMenuItems数组构造函数中声明这些JMenuItem,这样我就可以节省几行其他不必要的代码(也就是说,首先消除那些单独项的初始声明)。我会期待一些符合这个虚构代码的东西:

代码语言:javascript
复制
JMenuItem[] items = {JMenuItem itemA, JMenuItem itemB, JMenuItem itemC};

当然,不起作用的...but。有人能告诉我怎么做吗?顺便说一下,这些项将在后面的代码中初始化。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-17 09:17:50

替换这个

代码语言:javascript
复制
JMenuItem[] items = {JMenuItem itemA, JMenuItem itemB, JMenuItem itemC};

有了这个

代码语言:javascript
复制
JMenuItem[] items = {null, null, null}; //option 1
JMenuItem[] items = new JMenuItem[3]; //option 2
票数 4
EN

Stack Overflow用户

发布于 2019-09-17 09:59:25

为了声明变量而声明变量是不必要的--尽可能地在使用它们的地方声明它们。由于您没有将items的可见性设置为private或类似的,所以我假设您的代码驻留在一个方法中,可能是一个窗口的构造函数。在这种情况下,我建议在相同的语句中使用(精神)的雷伊:初始化和声明。我的代码看起来就像

代码语言:javascript
复制
JMenuItem[] items = {
    new JMenuItem(openFileAction),
    new JMenuItem(saveFileAction),
    new JMenuItem(exitApplicationAction)
};

这假设您正在使用Action的子类或更好的AbstractAction来为每个项提供标签、快捷方式、名称、图标和actionPerformed代码。操作的优点是,它们的名称比itemA具有更多的可记忆性,可以在多个地方调用(并显示)它们(作为按钮、项、多种类型的菜单),并且可以根据应用程序的状态启用/禁用它们(例如,当没有要保存的文件时,可以在任何地方禁用saveFileAction )。

实际上,我还会再走一步。由于创建菜单后很少需要更改菜单,并且您可以访问它们的内部操作来启用/禁用它们,因此可以跳过完全声明items

代码语言:javascript
复制
JMenu fileMenu = new JMenu("File");
fileMenu.add(new JMenuItem(openFileAction));
// ... 

编辑有关如何定义“一蹴而就”的内容:

我更喜欢使用动作而不是JMenuItems,因为动作更灵活(因为它们可以在几个地方使用)。您可以在一个调用中给一个操作一个标签和它的代码,这类似于您可以使用JMenuItems所做的事情。

代码语言:javascript
复制
Action exitApplicationAction = new AbstractAction("Exit application") {
    public void actionPerformed(ActionEvent ae) {
      System.exit(0);
    }
};

但是,拥有一个AbstractAction的家庭酿造子类(这里称为AllInOneAction )允许使用最小的样板同时设置所有内容(请注意,它比上面的示例要短得多!):

代码语言:javascript
复制
Action exitApplicationAction = new AllInOneAction(
   "Exit application", "exit.png", "Exit the program",
   KeyEvent.VK_E, "control shift E", () -> System.exit(0));

在内部,在该子类中,您将设置一组操作键:

代码语言:javascript
复制
public AllInOneAction(Object name, String iconName, String tooltip,
        Integer mnemonic, String accelerator, Runnable callback) {
    super("" + name); // allows your name to be an enum, useful for lookup
    putValue(Action.SHORT_DESCRIPTION, tooltip);
    putValue(Action.MNEMONIC_KEY, mnemonic);
    putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(accelerator));
    BufferedImage icon = loadImage(iconName); 
    BufferedImage small = scaleImage(icon, 16, 16);   
    putValue(Action.LARGE_ICON_KEY, new ImageIcon(icon));
    putValue(Action.SMALL_ICON, new ImageIcon(small));
    this.callback = callback;
}

请注意,loadImagescaleImage的实现只是一个练习,但对于“如何填充我的JMenu”这个最初的问题来说,这已经是一个很大的绕道。

票数 4
EN

Stack Overflow用户

发布于 2019-09-17 09:26:40

您可以像这样初始化数组:

代码语言:javascript
复制
JMenuItem[] items = {new JMenuItem(), new JMenuItem(), new JMenuItem()};

然后使用项目,items1,items2而不是itemA,itemB,itemC。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57971066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档