【问题标题】:How to enable / disable action in Netbeans Platform如何在 Netbeans 平台中启用/禁用操作
【发布时间】: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


【解决方案1】:

我自己没有这样做,但它似乎在“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);
}

【讨论】:

    【解决方案2】:

    感谢大家的回复。我终于通过扩展 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);
                }
            }
        } 
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 2013-04-03
      相关资源
      最近更新 更多