Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA在JMenuItem[]构造函数中声明未初始化的JMenuItem()项_Java_Arrays_Swing_Jmenuitem - Fatal编程技术网

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

JAVA在JMenuItem[]构造函数中声明未初始化的JMenuItem()项,java,arrays,swing,jmenuitem,Java,Arrays,Swing,Jmenuitem,我有以下代码: JMenuItem itemA; JMenuItem itemB; JMenuItem itemC; JMenuItem[] items = {itemA, itemB, itemC}; 我想做的是在JMenuItem数组构造函数中声明这些JMenuItems,这样我就可以节省几行其他不必要的代码,首先去掉这些单独项的初始声明。我期待着这段虚构的代码: JMenuItem[] items = {JMenuItem itemA, JMenuItem itemB, JMenuIte

我有以下代码:

JMenuItem itemA;
JMenuItem itemB;
JMenuItem itemC;
JMenuItem[] items = {itemA, itemB, itemC};
我想做的是在JMenuItem数组构造函数中声明这些JMenuItems,这样我就可以节省几行其他不必要的代码,首先去掉这些单独项的初始声明。我期待着这段虚构的代码:

JMenuItem[] items = {JMenuItem itemA, JMenuItem itemB, JMenuItem itemC};
……但这当然行不通。有人能告诉我怎么做吗? 顺便说一句,这些项目稍后将在代码中初始化。

替换此项

JMenuItem[] items = {JMenuItem itemA, JMenuItem itemB, JMenuItem itemC};
用这个

JMenuItem[] items = {null, null, null}; //option 1
JMenuItem[] items = new JMenuItem[3]; //option 2
替换这个

JMenuItem[] items = {JMenuItem itemA, JMenuItem itemB, JMenuItem itemC};
用这个

JMenuItem[] items = {null, null, null}; //option 1
JMenuItem[] items = new JMenuItem[3]; //option 2

可以按如下方式初始化阵列:

JMenuItem[] items = {new JMenuItem(), new JMenuItem(), new JMenuItem()};

然后使用项[0]、项[1]、项[2]而不是项A、项B、项C。

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

JMenuItem[] items = {new JMenuItem(), new JMenuItem(), new JMenuItem()};

然后使用项[0]、项[1]、项[2]而不是项A、项B、项C。

不需要为了声明变量而声明变量-声明变量时尽可能接近使用变量的位置。由于您没有将项的可见性设置为private或类似,因此我假设您的代码存在于一个方法中,可能是一个窗口的构造函数。在这种情况下,我建议在同一语句中使用:initialize&declare的精神。我的代码看起来像

JMenuItem[] items = {
    new JMenuItem(openFileAction),
    new JMenuItem(saveFileAction),
    new JMenuItem(exitApplicationAction)
};
这假设您正在使用Action的子类,或者更好地为每个项目提供标签、快捷方式、名称、图标和actionPerformed代码。动作的优点是,它们的名称比itemA更容易记住,它们可以在多个位置作为按钮、项目、多种菜单中调用和显示,并且可以根据应用程序的状态在所有位置启用/禁用,例如,当没有要保存的文件时,可以在任何地方禁用saveFileAction

事实上,我会更进一步。由于创建菜单后很少需要更改菜单,并且您可以访问菜单的内部操作以启用/禁用菜单,因此您可以完全跳过声明项:

JMenu fileMenu = new JMenu("File");
fileMenu.add(new JMenuItem(openFileAction));
// ... 
编辑有关如何一次性定义所有内容的信息:

我更喜欢使用动作来定义项目,因为动作更灵活,因为它们可以在多个地方使用。您可以在一次调用中为一个操作指定一个标签及其代码,这类似于您可以使用JMenuItems执行的操作:

然而,在这里有一个名为AllInOneAction的AbstractAction的自制子类,它允许用最少的样板文件一次设置所有内容。注意,它比上面的示例更短,而且做的更多!:

Action exitApplicationAction = new AllInOneAction(
   "Exit application", "exit.png", "Exit the program",
   KeyEvent.VK_E, "control shift E", () -> System.exit(0));
在该子类内部,您可以设置一组操作键:

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

请注意,loadImage和scaleImage的实现只是一个练习,但对于如何填充我的JMenu这个原始问题来说,这已经是一个足够大的迂回。

为了声明变量而声明变量是不必要的-声明变量时尽可能接近使用它们的位置。由于您没有将项的可见性设置为private或类似,因此我假设您的代码存在于一个方法中,可能是一个窗口的构造函数。在这种情况下,我建议在同一语句中使用:initialize&declare的精神。我的代码看起来像

JMenuItem[] items = {
    new JMenuItem(openFileAction),
    new JMenuItem(saveFileAction),
    new JMenuItem(exitApplicationAction)
};
这假设您正在使用Action的子类,或者更好地为每个项目提供标签、快捷方式、名称、图标和actionPerformed代码。动作的优点是,它们的名称比itemA更容易记住,它们可以在多个位置作为按钮、项目、多种菜单中调用和显示,并且可以根据应用程序的状态在所有位置启用/禁用,例如,当没有要保存的文件时,可以在任何地方禁用saveFileAction

事实上,我会更进一步。由于创建菜单后很少需要更改菜单,并且您可以访问菜单的内部操作以启用/禁用菜单,因此您可以完全跳过声明项:

JMenu fileMenu = new JMenu("File");
fileMenu.add(new JMenuItem(openFileAction));
// ... 
编辑有关如何一次性定义所有内容的信息:

我更喜欢使用动作来定义项目,因为动作更灵活,因为它们可以在多个地方使用。您可以在一次调用中为一个操作指定一个标签及其代码,这类似于您可以使用JMenuItems执行的操作:

然而,在这里有一个名为AllInOneAction的AbstractAction的自制子类,它允许用最少的样板文件一次设置所有内容。注意,它比上面的示例更短,而且做的更多!:

Action exitApplicationAction = new AllInOneAction(
   "Exit application", "exit.png", "Exit the program",
   KeyEvent.VK_E, "control shift E", () -> System.exit(0));
在该子类内部,您可以设置一组操作键:

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

请注意,loadImage和scaleImage的实现只是一个练习,但对于如何填充我的JMenu这个原始问题来说,这已经是一个很大的迂回。

优点。事实上,我们不需要为所有JMenuItems设置变量,而是可以通过there操作禁用、隐藏和重新标记这些菜单项。如果像您编写的fileMenu.addnew JMenuItemopenFileAction;那样定义,我们可以一次性定义项属性actionListener、setName吗;,我
你可以想象像fileMenu.addnew JMenuItem{setNamesome name;};-像这样的事情可能吗?这么简单的回答是不可能的,这是不可能的,我很难过地问。但是thanx扩展了你的答案,虽然它不是我想要的,因为它基本上没有区别,在减少代码到像fileMenu.addopenItem=new JMenuItemMAINMENU\u FILE\u OPEN这样的正常方式;openItem.AddActionListenerationEvent e->{…};。此外,您的代码实际上似乎比这种简单的方法复杂得多。如果您绝对必须使用JMenuItem而不是直接使用操作,则可以这样做:fileMenu.addnew JMenuItemnew AbstractActionsome name{public void actionPerformedActionEvent ae{System.exit0;}};。对这工作得很好-非常感谢如果这是我的问题的优点,你肯定会收到正确的答案标志…所以至少我点击向上箭头,因为你的答案很有用-也许你甚至可以把它放在你的文章的结尾,让其他人很容易找到它!好的观点。事实上,我们不需要为所有JMenuItems设置变量,而是可以通过there操作禁用、隐藏和重新标记这些菜单项。如果像您编写的fileMenu.addnew JMenuItemopenFileAction;那样定义,我们可以一次性定义项属性actionListener、setName吗;,我可以想象像fileMenu.addnew JMenuItem{setNamesome name;};-像这样的事情可能吗?这么简单的回答是不可能的,这是不可能的,我很难过地问。但是thanx扩展了你的答案,虽然它不是我想要的,因为它基本上没有区别,在减少代码到像fileMenu.addopenItem=new JMenuItemMAINMENU\u FILE\u OPEN这样的正常方式;openItem.AddActionListenerationEvent e->{…};。此外,您的代码实际上似乎比这种简单的方法复杂得多。如果您绝对必须使用JMenuItem而不是直接使用操作,则可以这样做:fileMenu.addnew JMenuItemnew AbstractActionsome name{public void actionPerformedActionEvent ae{System.exit0;}};。对这工作得很好-非常感谢如果这是我的问题的优点,你肯定会收到正确的答案标志…所以至少我点击向上箭头,因为你的答案很有用-也许你甚至可以把它放在你的文章的结尾,让其他人很容易找到它@Abra你读了吗?我说他们在代码中被初始化了?所以是的,这就是我想要的。@Abra你读过我说的代码后面初始化的地方吗?是的,这就是我想要的。