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

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

=== Where can I find examples of how to use various APIs?

There are a large number of samples. Many of these correspond to the tutorials. You can find the samples in module `platform` in `main/misc` repository at `hg.netbeans.org`. They are in the `samples/` subdirectory.

The `platform/samples/` folder can be link:http://hg.netbeans.org/main/misc/file/tip/platform/samples/[browsed online here]. But for really trying things out it is usually more useful to link:HgHowTos.asciidoc[have a local copy] - then you can open them as projects in the 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/DevFaqSampleCode[http://wiki.netbeans.org/DevFaqSampleCode] , 
that was last modified by NetBeans user Admin 
on 2009-11-06T15:59:39Z.


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