【发布时间】:2015-08-14 11:08:18
【问题描述】:
我花了将近三天时间尝试在 netbeans 平台中简单地启用/禁用操作,我认为这很简单,应该是一个通用功能,但比我想象的要复杂。
在乞求时,我试图查看在生成的默认操作上是否有一个 setEnable() 方法,令我惊讶的是没有。然后我开始研究它,我发现最常见的方法是设置有条件启用的操作(这取决于 Cookie 类),所以我想出了如何将假类添加到 Lookup 以便启用和禁用,我是按照以下方式做到的。为了测试它,我将以下代码添加到另一个应该启用或禁用第二个操作的操作中。
private final PlottingStarted plottingStarted = new PlottingStarted();
@Override
public void actionPerformed(ActionEvent e) {
// TODO implement action body
if (Lookup.getDefault().lookup(PlottingStarted.class) == null) {
ic.add(plottingStarted);
}else{
ic.remove(plottingStarted);
}
所以 PlottingStarted 是我创建的一个假对象,其唯一目的是在查找中禁用或启用该操作。
由于某种原因,它根本没有做任何事情,该动作总是被禁用。我尝试了很多东西,最后我放弃了。
然后我尝试了一种不同的方法,并使用了具有 setEnabled() 功能的 AbstractActions。
为了检索我自己基于一个 Geertjan 博客的操作,我创建了以下方法
public Action findAction(String actionName) {
FileObject myActionsFolder = FileUtil.getConfigFile("Actions/RealTimeViewer");
if (myActionsFolder != null){
FileObject[] myActionsFolderKids = myActionsFolder.getChildren();
for (FileObject fileObject : myActionsFolderKids) {
//Probably want to make this more robust,
//but the point is that here we find a particular Action:
if (fileObject.getName().contains(actionName)) {
try {
DataObject dob = DataObject.find(fileObject);
InstanceCookie ic = dob.getLookup().lookup(InstanceCookie.class);
if (ic != null) {
Object instance = ic.instanceCreate();
if (instance instanceof Action) {
Action a = (Action) instance;
return a;
}
}
} catch (Exception e) {
ErrorManager.getDefault().notify(ErrorManager.WARNING, e);
return null;
}
}
}
}
return null;
}
此方法运行良好,我能够检索操作并调用其 setEnabled() 方法。不幸的是,无论我为什么这样做,Action 总是启用的。
阅读一些文献我发现我应该将以下内容添加到动作“lazy = false”的注册中,最后我能够启用和禁用动作......但是当然默认注册丢失了,我有没有图标和名称。
现在我决定再次发帖,因为我不敢相信它需要这么复杂,一定有办法让它变得更容易。我唯一需要的是具有 PLAY / STOP 功能,当启用 PLAY 时,STOP 被禁用,反之亦然。
【问题讨论】:
-
我假设播放/停止绑定到某种输入元素?
-
不清楚这些动作是如何触发的。无论如何,在 PLAY 时,您应该添加 actionlistener,在 STOP 时,您应该删除 actionlistener。我不知道你为什么要解决这个问题。
标签: java netbeans action netbeans-platform