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

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

== How do I display different groups of properties on buttons in the property sheet the way Matisse does?

This is only really useful if you have a *lot* of properties - and having lots of properties is usually not a great idea, as the user has to search for the things they want to change.

Nonetheless, if you want to group different sets of properties on different buttons, it is quite simple.  `Node.PropertySet` extends `java.beans.FeatureDescriptor`.  It inherits the methods `putValue (key, value)` and `getValue(key, value)` which allow you to add ad-hoc key/value pairs to any `PropertySet`.  What you do is pass a String with the text that should be on the button, assigned to the key "tabName":

[source,java]
----

somePropertySet.putValue ("tabName", NbBundle.getMessage (getClass(), "KEY_Something"));
----

(the above code gets you a localized string - you can also pass a hard-coded one if you are sure your UI will never need to be translated).

All `PropertySet`s that have the same value will be included under the same button/tab in the property sheet.

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


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