DevFaqActionAddProjectTypePopUpJa

特定のプロジェクト形式のプロジェクトポップアップメニューにアクションを追加するにはどのようにしたらよいですか?

{Projects/Actions/</tt> フォルダ以下のレイヤーに追加する事で、"すべて"のプロジェクトのコンテキストメニューにアクションをインストールする事ができます。アクションは context-sensitive であるべきであり、 ContextAwareAction}} を実装するプレースホルダーであるべきということを意味します。context-aware 派生アクションは実際の動作を行うでしょう。普通は提供される <tt>Lookup (コンテキスト) 中の Project のインスタンスを探します。

もし、 context に基づく派生したアクションの isEnabled をただオーバーライドしだだけなら、不適切なプロジェクトの場合にはグレイアウトされるが、メニュー項目は常に存在するでしょう。関連するプロジェクト以外のすべてにおいてメニュー項目を隠したい場合は、 Presenter.Popup を実装した派生アクションを作成する必要があり、結果のコンポーネントも DynamicMenuContext の実装するべきです。

これは多くの定型文なので(できれば、 API の将来のリビジョンにおいてよりシンプルに且つ/またはモジュール開発サポートがこのためのウィザードを含むようになればいいのですが)、コピーし、カスタマイズ可能な例を示すのがよいでしょう。以下の簡易なアクションは、名前がアルファベットの前半に入るという条件のプロジェクトの場所を表示します:

package projectcontextmenudemo;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JMenuItem;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectUtils;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.awt.DynamicMenuContent;
import org.openide.awt.Mnemonics;
import org.openide.filesystems.FileUtil;
import org.openide.util.ContextAwareAction;
import org.openide.util.Lookup;
import org.openide.util.actions.Presenter;
public class DemoAction extends AbstractAction implements ContextAwareAction {
    public void actionPerformed(ActionEvent e) {assert false;}
    public Action createContextAwareInstance(Lookup context) {
        return new ContextAction(context);
    }
    private boolean enable(Project p) {
        assert p != null;
        // TODO for which projects action should be enabled
        char c = ProjectUtils.getInformation(p).getDisplayName().charAt(0);
        return c >= 'A' && c <= 'M';
    }
    private String labelFor(Project p) {
        assert p != null;
        // TODO menu item label with optional mnemonics
        return "&Info on " + ProjectUtils.getInformation(p).getDisplayName();
    }
    private void perform(Project p) {
        assert p != null;
        // TODO what to do when run
        String msg = "Project location: " + FileUtil.getFileDisplayName(p.getProjectDirectory());
        DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(msg));
    }
    private final class ContextAction extends AbstractAction implements Presenter.Popup {
        private final Project p;
        public ContextAction(Lookup context) {
            Project _p = (Project) context.lookup(Project.class);
            p = (_p != null && enable(_p)) ?_p : null;
        }
        public void actionPerformed(ActionEvent e) {
            perform(p);
        }
        public JMenuItem getPopupPresenter() {
            class Presenter extends JMenuItem implements DynamicMenuContent {
                public Presenter() {
                    super(ContextAction.this);
                }
                public JComponent[] getMenuPresenters() {
                    if (p != null) {
                        Mnemonics.setLocalizedText(this, labelFor(p));
                        return new JComponent[] {this};
                    } else {
                        return new JComponent[0];
                    }
                }
                public JComponent[[ | ]] synchMenuPresenters(JComponent[] items) {
                    return getMenuPresenters();
                }
            }
            return new Presenter();
        }
    }
}

どのように登録するかは次のとおりです:

<filesystem>
    <folder name="Projects">
        <folder name="Actions">
            <file name="projectcontextmenudemo-DemoAction.instance"/>
        </folder>
    </folder>
</filesystem>

バージョン: NetBeans 5.0, 5.5


Not logged in. Log in, Register

By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2012, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo