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

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

=== How do I add a new panel to a Project Properties dialog?

Create and register the panel (here for Java SE projects):

[source,java]
----

@ProjectCustomizer.CompositeCategoryProvider.Registration(
    projectType="org-netbeans-modules-java-j2seproject")
public class BlaPanelProvider implements ProjectCustomizer.CompositeCategoryProvider {
    public @Override Category createCategory(Lookup context) {
        return ProjectCustomizer.Category.create(
                "Bla",
                "Bla",
                null,
                null);
    }
    public @Override JComponent createComponent(Category category, Lookup context) {
        return new BlaPanel();
    }
}
----

See also link:http://blogs.sun.com/gridbag/entry/project_properties_gui_for_custom[Project Properties GUI for custom project templates] and link:http://netbeans.dzone.com/new-tabs-netbeans-project-props[Adding New Tabs to the Project Properties Dialog in NetBeans IDE].

=== 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/DevFaqActionAddProjectCustomizer[http://wiki.netbeans.org/DevFaqActionAddProjectCustomizer] , 
that was last modified by NetBeans user Jglick 
on 2010-06-14T23:00:56Z.


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