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

= Introduction to NetBeans IDE 6.5
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Introduction to NetBeans IDE 6.5 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Introduction to NetBeans IDE 6.5

|===
|In this screencast, Sridhar Reddy shows new Java developers NetBeans IDE 6.5 editor features and gives a short introduction on how to edit, compile and run Java programs and use the productivity features in NetBeans IDE.

This tutorial is part of the link:../intro-screencasts.html[+Guided Video Tour of NetBeans IDE 6.5+].

Author: Sridhar Reddy
Time: 14:21
link:http://mediacast.sun.com/users/sridharpreddy/media/IntroToNB65_sml.flv[+Download+] [66.5 MB]


== Related links

* link:http://java.sun.com/developer/onlineTraining/[+Java Online Training+]
* link:http://java.sun.com/javase/6/docs/[+Java SE Documentation+]
* link:https://netbeans.org/kb/index.html[+NetBeans IDE Tutorials+]
* link:http://java.sun.com/javase/[+Java SE Overview+]
* link:http://developers.sun.com/events/techdays/[+Sun Tech Days+]
link:/about/contact_form.html?to=3&subject=Feedback: NB 6.5 intro screencast[+Send Feedback on This Tutorial+]
 |  
|===
