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

= Видео 'Поддержка JavaFX в IDE NetBeans'
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Видео 'Поддержка JavaFX в IDE NetBeans' - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Видео 'Поддержка JavaFX в IDE NetBeans'

|===
|В этой экранной демонстрации показаны функции NetBeans IDE 7.4, связанные с JavaFX

* Путь к классу выполнения JavaFX
* Выравнивание проектов JavaFX и Java SE
* Шаблон проекта JavaFX Maven
* Типы файлов JavaFX в проектах Maven

Авторы: Петр Сомол (Petr Somol), Алена Сташкова (Alyona Stashkova) 
Продолжительность: 7:04

link:http://bits.netbeans.org/media/netbeans_fx.mp4[+Смотреть видео полностью/Загрузить+] (.mp4) (Ctrl-Click для загрузки, 19,5 МБ)

link:/about/contact_form.html?to=3&subject=Feedback:%20Screencast%20-%20JavaFX%20Support%20in%20NetBeans%20IDE[+Мы ждем ваших отзывов+]
 |  
|===


== Связанные ссылки

* link:http://wiki.netbeans.org/NewAndNoteworthyNB74[+NetBeans 74 New And Noteworthy+]
* link:http://wiki.netbeans.org/JavaFX[+JavaFX - NetBeans Wiki+]
* link:http://docs.oracle.com/javafx/[+JavaFX 2 Documentation Home+]
