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

= Video of NetBeans IDE Support for Java ME 8
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:syntax: true
:icons: font
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Video of NetBeans IDE Support for Java ME 8 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Video of NetBeans IDE Support for Java ME 8

|===
|This screencast demonstrates NetBeans IDE support for Oracle Java ME SDK 8 on the Windows operating system. It shows how to:

* activate Java ME support in NetBeans IDE (at 1:17)
* register Java ME 8 SDK in NetBeans IDE (at 2:04)
* create a Java ME 8 Embedded Project (at 3:06)
* customize a Java ME 8 Embedded Project (at 4:01)
* run a Java ME 8 Embedded Project (at 5:58)

Authors: Roman Svitanic, Alyona Stashkova
Time: 6:38

link:http://bits.netbeans.org/media/nb_me_8.mp4[+Watch full size/Download+] (.mp4) (Ctrl-Click to download, 12,2 MB)

NOTE: Closed captioning is available for this video. Click the CC button at the bottom of the video to turn closed captions on.

link:/about/contact_form.html?to=6&subject=Feedback:%20Screencast%20-%20NetBeans%20IDE%20Support%20for%20Java%20ME%208%20EA[+Send Us Your Feedback+]
 |  |  |  
|===


== Related Links

* link:http://wiki.netbeans.org/JavaMEEmbeddedHowTo[+Java ME Embedded How To+]
* link:http://docs.oracle.com/javame/embedded/embedded.html[+Oracle Java ME for Embedded Devices Documentation+]
* link:http://www.oracle.com/technetwork/java/embedded/documentation/me-e-otn-faq-1852008.pdf[+Oracle Java ME Embedded Overview and Frequently Asked Questions+]
* link:http://wiki.netbeans.org/JavaMESDKSupport[+FAQ on Java ME SDK Support in NetBeans IDE+]
* link:https://netbeans.org/kb/trails/mobility.html[+Java ME and Java Card Application Technology Trail+]
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG1552[+Developing Java ME Applications+] in _Developing Applications with NetBeans IDE_
* link:http://www.oracle.com/technetwork/java/javame/javamobile/download/overview/index.html[+Java for Mobile Devices Download+]
