// 
//     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.
//

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

=== How do I add an action to the menu bar?

The simplest way is to run New Action Wizard (File > New... > Module Development > Action) which creates an action for you and registers it in your layer.xml file.

=== See also:

* link:DevFaqActionsFolder.asciidoc[An example how to register action manually ]
* link:DevFaqActionAddFileMime.asciidoc[How do I add an action to a file of a given mime-type? ]
* link:DevFaqActionAddFolder.asciidoc[How do I add an action to a folder? ]
* link:DevFaqActionAddEditorPopup.asciidoc[How do I add an action to the text-editor popup menu? ]
* link:DevFaqActionAddToolBar.asciidoc[How do I add an action to the NetBeans tool bar? ]
* link:DevFaqActionAddDataObject.asciidoc[How do I add an action to my custom node? ]

=== 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/DevFaqActionAddMenuBar[http://wiki.netbeans.org/DevFaqActionAddMenuBar] , 
that was last modified by NetBeans user Admin 
on 2009-11-06T15:34:17Z.


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