// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= DevFaqInvokeActionProgrammatically
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqInvokeActionProgrammatically
:description: Apache NetBeans wiki DevFaqInvokeActionProgrammatically
:toc: left
:toc-title:
:syntax: true

=== How do I invoke an action programmatically?

Use `FileUtil.getConfigObject()`

[source,java]
----

//provide the path to your action instance
Action action = FileUtil.getConfigObject("Actions/Window/org-netbeans-core-windows-actions-MaximizeWindowAction.instance", Action.class);
action.actionPerformed(ev);
----

or

[source,java]
----

//provide the path to the action folder
List<? extends Action> actions = org.openide.util.Utilities.actionsForPath("Navigation/Hierarchy/text/x-java/Actions")
//Bonus: Create a popupmenu from these actions
//Action[] aactions = actions.toArray(new Action[]{});
//JPopupMenu menu = Utilities.actionsToPopup(aactions, getLookup());
----

or `Actions.forID()` (since NB 7.2)

[source,java]
----

//provide category and classname
Action action=org.openide.awt.Actions.forID("Window", "org.netbeans.core.windows.actions.MaximizeWindowAction");
action.actionPerformed(ev);
----

See 

* link:http://bits.netbeans.org/dev/javadoc/org-openide-filesystems/org/openide/filesystems/FileUtil.html#getConfigObject(java.lang.String,%20java.lang.Class[http://bits.netbeans.org/dev/javadoc/org-openide-filesystems/org/openide/filesystems/FileUtil.html#getConfigObject(java.lang.String,%20java.lang.Class])
* link:http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/Actions.html#forID(java.lang.String,%20java.lang.String[http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/Actions.html#forID(java.lang.String,%20java.lang.String])

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqInvokeActionProgrammatically[http://wiki.netbeans.org/DevFaqInvokeActionProgrammatically] , 
that was last modified by NetBeans user Markiewb 
on 2016-07-23T12:51:30Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
