当我尝试禁用我的Netbeans平台项目的Action时,我遇到了一些问题。当应用程序启动时,必须禁用某些操作,并且我使用此方法执行此操作:
CallableSystemAction.get(BuildProjectAction.class).setEnabled(FLAG);
它可以工作,因为BuildProjectAction被禁用,但MenuBar和工具栏的相应项目保持启用状态,直到我点击其中一个。 只有在我点击它之后,合同才开始正常工作。 第一个问题:为什么?
如果我想要禁用一个动作,很明显我也想要禁用菜单和工具栏中的相对图标,所以当我调用Action.setEnabled(false)
时它必须是自动的。
如果我没有点击它们,那么没有意识到图标没有刷新。
如果我尝试使用.getToolbarPresenter().setEnabled(false);
和.getMenuPresenter().setEnabled(false);
为了启动禁用图标的应用程序,我尝试将lazy属性设置为FALSE,并使用为菜单和工具栏设置相同图像的方法setIcon(new ImageIcon(image));
以编程方式声明图像。
它有效;只有另一个问题:菜单和工具栏有不同大小的图标(16x16和24x24)。
如果我自动选择了@ActionRegistration(iconBase = "image.png")
设置带有正确图标的图标,则没有任何意义,但如果我使用方法.setIcon()
,则不会。
我已经阅读了一些关于Action,CookieAction,Lookup的文章,但我唯一需要的是在禁用Action的同一时刻禁用图形元素。 第二个问题:我怎么能这样做?
这是我的行动的一个例子。
@ActionID(
category = "Run",
id = "BuildProjectAction")
@ActionRegistration(
lazy = true,
iconBase = "images/icons/compile.png",
displayName = "#CTL_BuildProjectAction")
@ActionReferences({
@ActionReference(
path = "Menu/Run",
position = 3),
@ActionReference(path = "Toolbars/Run",
position = 3),
@ActionReference(
path = "Shortcuts",
name = "D-B")
})
@Messages("CTL_BuildProjectAction=Build Project")
public final class BuildProjectAction extends CallableSystemAction {
@Override
public void actionPerformed(ActionEvent e) {...}
@Override
public void performAction() {}
@Override
public String getName() {
return Bundle.CTL_BuildProjectAction();
}
@Override
public HelpCtx getHelpCtx() {
return HelpCtx.DEFAULT_HELP;
}
由于
答案 0 :(得分:0)
创建在启动时禁用的操作的最简单方法是使用平台的“新建操作向导”来创建操作,并创建一个依赖于" context" - 这是在全局查找中查找特定对象时。如果查找中没有可用的对象(如启动时),则将禁用该操作。
菜单和工具栏图形元素通过注释与您的操作捆绑在一起。这意味着您的上下文感知操作的启用/禁用状态也会自动影响菜单和工具栏中的图标。
Geertjan Wielenga撰写的这篇文章详细介绍了创建上下文感知操作:
http://netbeans.dzone.com/how-to-make-context-sensitive-actions
如果要启用操作,则会将操作所依赖的对象添加到全局查找中,这将导致操作(及其图形元素)被启用。
平台开发者常见问题解答中的这个条目提供了一些如何将对象添加到全局上下文的示例:
http://wiki.netbeans.org/DevFaqAddGlobalContext
如果您需要创建一个依赖于更复杂条件的操作,那么在此平台开发人员列表线程中会有一些讨论,以及说明如何执行此操作的代码示例:
http://forums.netbeans.org/ptopic55295.html
平台会自动创建禁用操作时显示的图标的灰显版本。你只需要提供正常的"非灰显图像。
对于不同大小的图标,这是文件名约定的问题。如果您的注释使用@ActionRegistration(iconBase = "image.png”)
声明图标,那么您将提供名为“image.png”的16x16图像和名为“image24.png”的24x24图像。平台将在菜单和工具栏中找到并使用适当的大小。