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

= Editing Java Code in NetBeans IDE 6.9.1
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Editing Java Code in NetBeans IDE 6.9.1 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Editing Java Code in NetBeans IDE 6.9.1

|===
|This is a retake of the demonstration for 6.9 that walks you through creation of a simple Java application in the Java Editor of NetBeans IDE 6.9.1.

In the screencast, you will see how to use editor productivity features, such as code completion, code templates, and error hints. You will learn how to effectively use the capabilities of the IDE's Java editor.

Authors: Irina Filippova and Vita Stejskal
Time: 12:09

link:http://bits.netbeans.org/media/javaeditor.swf[+Watch now (.swf)+] (Ctrl-Click to download, 79 MB)

link:http://bits.netbeans.org/media/nb69-code-completion-screencast.mp4[+Watch now (.mp4)+] (Ctrl-Click to download, 34 MB)

If you are having problems viewing the screencast on the right, allow the screencast to download before starting. Alternatively, you can click the link above to view the full-size version of the screencast.


== Related links

* link:../intro-screencasts.html[+Guided Video Tour of NetBeans IDE 6.9+]
* link:https://netbeans.org/kb/index.html[+NetBeans IDE Tutorials: General Java Development +]
* link:https://netbeans.org/kb/index.html[+NetBeans IDE Documentation +]
link:/about/contact_form.html?to=3&subject=Feedback: Editing Java Code in NetBeans IDE 6.9.1 Screencast[+Send Feedback on This Tutorial+]
 |         
|===
