如何在Netbeans平台中启用/禁用动作



我花了将近三天的时间试图在netbeans平台上做一个简单的启用/禁用Actions,我认为这很简单,应该是一个常见的功能,比我想象的要复杂得多。

在乞求,我试图看看是否有一个setEnable()方法上生成的默认操作,令我惊讶的是,没有。然后我开始研究,我发现最常见的方法是设置一个有条件启用的操作(这取决于一个Cookie类),所以我想出了如何添加一个假类的查找,这样它被启用和禁用,我做了下面的方式。为了测试它,我将以下代码添加到另一个操作中,该操作应该启用或禁用第二个操作。

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是我创建的一个假对象,其唯一目的是在查找中禁用或启用操作。

由于某些原因,它根本没有做任何事情,Action总是被禁用。我尝试了很多事情,最后我放弃了。

然后我尝试了一种不同的方法,并使用具有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"的注册中添加以下内容,最后我能够启用和禁用动作…但当然默认的注册丢失了,我没有图标和名称。

现在我决定再次发布,因为我无法相信它需要那么复杂,一定有一种更简单的方法。我唯一需要的是有一个播放/停止功能,当播放是启用停止是禁用的,反之亦然。

我自己没有这样做过,但它似乎在《Netbeans初学者平台》一书的第5.1.2.1章"复杂启用"中有介绍。https://leanpub.com/nbp4beginners

这本书不是免费的,但是相应的代码示例可以在github。https://github.com/walternyland/nbp4beginners/tree/master/chapters/ch05/5.1.2.1他扩展了AbstractAction,覆盖了resultChanged方法,并使用super.setEnabled()。

@ActionID(id = "org.carsales.evaluator.EvaluateCarAction1", category = "Car")
@ActionRegistration(displayName = "not-used", lazy = false)
public class EvaluateCarAction extends AbstractAction
implements ContextAwareAction, LookupListener {
// ...
@Override
public void resultChanged(LookupEvent le) {
    //Optionally, check if the property is set to the value you're interested in
   //prior to enabling the Action.
   super.setEnabled(result.allInstances().size() > 0);
}

感谢大家的回复。我最终通过扩展AbstractAction使其工作,看起来即使您注册了"lazy = false",一些注册仍然由平台完成,您只需要在Action构造函数中进行一些小的调整。最后的结果是

@ActionID(
        category = "RealTimeViewer",
        id = "main.java.com.graph.actions.StopPlotting"
)
@ActionRegistration(
        //iconBase = "main/java/com/graph/images/stop-plotting-24x24.png",
        displayName = "#CTL_StopPlotting",
        lazy = false
)
@ActionReference(path = "Toolbars/RealTimeViewer", position = 600)
@Messages("CTL_StopPlotting=Stop Plotting")
public final class StopPlotting extends AbstractAction{
private static final String ICON = "main/java/com/dacsys/cna/core/graph/images/stop-plotting-24x24.png";
public StopPlotting() {
    putValue(SMALL_ICON, ImageUtilities.loadImageIcon(ICON, false));
    putValue(NAME, Bundle.CTL_StopPlotting());
    this.setEnabled(false);
}
@Override
public void actionPerformed(ActionEvent e) {
    // TODO implement action body
    Action a = new ActionsHelper().findAction("StartPlotting");
    if (a != null){
        if (a != null){
            if (a.isEnabled()){
                a.setEnabled(false);
                this.setEnabled(true);
            }else{
                a.setEnabled(true);
                this.setEnabled(false);
            }
        }
    } 
}

}

相关内容

  • 没有找到相关文章

最新更新