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

= Tour em Vídeo Guiado do NetBeans IDE
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Tour em Vídeo Guiado do NetBeans IDE - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Tour em Vídeo Guiado do NetBeans IDE

Assista aos screencasts abaixo para descobrir novas funcionalidades e destaques no NetBeans IDE.


== Visão Geral do NetBeans IDE 8.0

|===
|link:java/jdk8-migration-screencast.html[+ +]image::../../images_www/v7/2/nb72-video-thumb.png[]
 |O link:../../community/releases/80/index.html[+*NetBeans IDE 8.0*+] oferece suporte total para as últimas tecnologias Java 8 -- Java SE 8, Java SE Embedded 8 e Java ME Embedded 8. O IDE oferece também diversos aprimoramentos novos para Maven e Java EE com PrimeFaces, novas ferramentas para HTML5, especialmente para AngularJS, bem como aperfeiçoamentos para PHP e suporte a C/C++. 

Assista ao link:ide/overview-screencast.html[+*Vídeo da Visão Geral do NetBeans IDE 8.0*+] para descobrir as novidades e os destaques desta última release.
 
|===


== Screencasts do NetBeans IDE 8.0

|===
|image:::images/smartmigration.png[role="left", link="java/jdk8-migration-screencast.html"] 

Hora: 14:00
link:http://bits.netbeans.org/media/smart-migration-java8.mp4[+*Download*+] [60 MB]

 |link:java/jdk8-migration-screencast.html[+ Migração Inteligente para JDK 8+]

Este screencast é um guia para as principais funcionalidades dos aprimoramentos de linguagem em Java 8 e como usar o IDE para ajudar na migração de código para Java 8.

 |  |image:::images/primefaces.png[role="left", link="javaee/maven-primefaces-screencast.html"] 

Hora: 4:39
link:http://bits.netbeans.org/media/prime-faces-nb8.mp4[+*Download*+] [37 MB]

 |link:javaee/maven-primefaces-screencast.html[+ Desenvolvimento de PrimeFaces com o NetBeans IDE 8 +]

Este screencast demonstra como usar o NetBeans IDE 8.0 para criar uma aplicação CRUD completa usando Java EE 7, Maven e PrimeFaces.

 

|image:::images/me8.png[role="left", link="java/jdk8-migration-screencast.html"] 

Hora: 6:38
link:http://bits.netbeans.org/media/nb_me_8.mp4[+*Download*+] [12 MB]

 |link:javame/nb_me8_screencast.html[+ Suporte do NetBeans IDE para Java ME 8+]

Este screencast demonstra o suporte do NetBeans IDE para Oracle Java ME SDK 8 no sistema operacional Windows.

 |  |
 |
 
|===


== Screencasts do NetBeans IDE 7.4

|===
|image:::images/jdk8-lambda.png[role="left", link="java/jdk8-nb74-screencast.html"] 

Hora: 3:44
link:http://bits.netbeans.org/media/jdk8-gettingstarted.mp4[+*Download*+] [30 MB]

 |link:java/jdk8-nb74-screencast.html[+ *JDK 8 no NetBeans IDE*+]

Este screencast demonstra como configurar o NetBeans IDE 7.4 para usar o JDK 8 e como usar o suporte ao perfil JDK 8 e as expressões lambda.

 |  |image:::images/html5-javaee.png[role="left", link="javaee/javaee-gettingstarted-js-screencast.html"] 

Hora: 5:10
link:http://bits.netbeans.org/media/html5-gettingstarted-javaee-screencast.mp4[+*Download*+] [41 MB]

 |link:javaee/javaee-gettingstarted-js-screencast.html[+ Desenvolvimento do Cliente JavaScript no Java EE+]

Este screencast mostra que você pode expor os pontos finais do web service de RESTful por meio de um assistente que permite a você criar clientes JavaScript Backbone.js nas aplicações Java EE no NetBeans IDE 7.4.

 

|image:::images/html5-cordova.png[role="left", link="web/html5-cordova-screencast.html"] 

Hora: 5:08
link:http://bits.netbeans.org/media/html5-gettingstarted-cordova-final-screencast.mp4[+*Download*+] [36 MB]

 |link:web/html5-cordova-screencast.html[+ *Conceitos Básicos sobre Cordova no NetBeans IDE*+]

Este screencast demonstra como criar as aplicações HTML5, isto é, como criar aplicações que usam HTML, JavaScript e CSS e implantá-las como aplicações Android ou iOS nativas por meio de Cordova.

 |  |image:::images/javaee-primefaces.png[role="left", link="javaee/javaee-gettingstarted-pf-screencast.html"] 

Hora: 5:05
link:http://bits.netbeans.org/media/javaee-html5-primefaces.mp4[+*Download*+] [63 MB]

 |link:javaee/javaee-gettingstarted-pf-screencast.html[+ Desenvolvimento de Java EE com PrimeFaces+]

Este screencast mostra como as aplicações PrimeFaces podem ser criadas facilmente com Maven e Java EE no NetBeans IDE 7.4.

 

|image:::images/javagui-javafx.png[role="left", link="java/nb_fx_screencast.html"] 

Hora: 7:04
link:http://bits.netbeans.org/media/netbeans_fx.mp4[+*Download*+] [19 MB]

 |link:java/nb_fx_screencast.html[+ *Suporte de JavaFX no NetBeans IDE*+]

Este screencast demonstra as funcionalidades relacionadas a JavaFX que são implementadas no NetBeans IDE 7.4, incluindo o classpath de runtime JavaFX, o alinhamento do JavaFX e os projetos Java SE e o modelo do projeto JavaFX Maven.

 |  |image:::images/javame-thumb.png[role="left", link="javame/nb_mesdk_screencast.html"] 

Hora: 4:22
link:http://bits.netbeans.org/media/nb_mesdk.mp4[+*Download*+] [6 MB]

 |link:javame/nb_mesdk_screencast.html[+ Configurando o NetBeans IDE para Desenvolvimento Móvel no Windows+]

Este screencast demonstra o suporte para o Java ME SDK no NetBeans IDE. Este screencast mostra como ativar os plug-ins Java ME e registrar o SDK de Java ME no NetBeans IDE.

 

|image:::images/git-thumb.png[role="left", link="ide/github_nb_screencast.html"] 

Hora: 5:52
link:http://bits.netbeans.org/media/github_nb.mp4[+*Download*+] [11 MB]

 |link:ide/github_nb_screencast.html[+ Configurando um Repositório GitHub Usando o NetBeans IDE+]

Este screencast demonstra como configurar um repositório Git no NetBeans IDE e colocá-lo no GitHub usando o suporte do IDE para o sistema de controle de versão do Git.

 |  |image:::images/clone_thumb.png[role="left", link="ide/git_nb_ssh_screencast.html"] 

Hora: 3:25
link:http://bits.netbeans.org/media/git_nb_ssh.mp4[+*Download*+] [6 MB]

 |link:ide/git_nb_ssh_screencast.html[+ Clonando um Repositório Git Usando o NetBeans IDE+]

Este screencast demonstra como obter um projeto Git clonando um repositório Git existente em um servidor remoto por meio do protocolo SSH.

 
|===



== Mais Screencasts do NetBeans IDE

Acesse a link:../../community/media.html[+Biblioteca de Mídia do NetBeans+] e o link:http://www.youtube.com/user/netbeansvideos[+Canal do YouTube do NetBeans+] para obter tutoriais em vídeo adicionais do NetBeans IDE.

