没有必要为了声明变量而声明变量 - 将它们声明为尽可能靠近它们的使用位置。由于您没有将items 的可见性设置为private 或类似的,我假设您的代码存在于一个方法中,可能是一个窗口的构造函数。在这种情况下,我建议使用RAII 的(精神):在同一语句中进行初始化和声明。我的代码看起来像
JMenuItem[] items = {
new JMenuItem(openFileAction),
new JMenuItem(saveFileAction),
new JMenuItem(exitApplicationAction)
};
这假设您使用Action 的子类,或者更好的是AbstractAction 来为每个项目提供标签、快捷方式、名称、图标和actionPerformed 代码。动作的优点是它们的名称比itemA 更容易记住,它们可以在多个地方调用(和显示)(作为按钮、作为项目、在多种类型的菜单中),并且可以在所有这些都取决于应用程序的状态(例如,当没有要保存的文件时,saveFileAction 可以在任何地方禁用)。
实际上,我会更进一步。由于菜单创建后很少需要更改,并且您可以访问其内部操作来启用/禁用它们,因此您可以完全跳过声明 items:
JMenu fileMenu = new JMenu("File");
fileMenu.add(new JMenuItem(openFileAction));
// ...
编辑关于如何定义“一次完成所有事情”:
对于 JMenuItems,我更喜欢使用 Actions,因为 Actions 更灵活(因为它们可以在多个地方使用)。您可以在一次调用中为操作提供标签及其代码,这类似于您可以使用 JMenuItems 执行的操作:
Action exitApplicationAction = new AbstractAction("Exit application") {
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
};
但是,拥有 AbstractAction 的自制子类(此处称为 AllInOneAction)允许以最少的样板文件一次设置 所有内容(请注意,它比上面的例子!):
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”的原始问题已经足够大了。