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

= Camí d'aprenentatge de les GUI d'aplicacions Java i JavaFX
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Camí d'aprenentatge de les GUI d'aplicacions Java i JavaFX - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Camí d'aprenentatge de les GUI d'aplicacions Java i JavaFX

== Què són les GUI d'aplicacions Java i Java FX?

Una aplicació gràfica Java utilitza el conjunt de components GUI estàndards de Java, Swing, i es desplega a l'escriptori. Com en altres aplicacions Java, les aplicacions gràfiques (GUI) Java poden desplegar-se a Microsoft Windows, Linux, Mac OS, OpenSolaris i qualsevol altre sistema operatiu que contingui l'entorn d'execució de Java (JRE).

El constructor GUI en l'IDE NetBeans us permet crear aplicacions GUI Java de forma visual.

JavaFX és una plataforma de client rica per a construcció d'aplicacions i de continguts en dispositius encreuats. La plataforma JavaFX inclou un llenguatge declaratiu sincer anomenat JavaFX Script que fa realment senzilla la definició d'interfícies d'usuari eloqüents. Hi ha un conjunt de complements a l'IDE NetBeans IDE, gràfics, biblioteques de suport medis i sons, i entorns d'execució que permeten la construcció de RIAs (rich internet applications) amb una aparença i aspecte consistents, a través de dispositius amb diversos factors de formulari i capacitats.

== Getting Started

* link:../docs/java/gui-functionality.html[+Introduction to Java GUI Building+]

== Tutorials and Articles

=== Designing Java GUIs

* link:../docs/java/quickstart-gui.html[+GUI Building in NetBeans IDE+]
* link:../docs/java/quickstart-gui-legend.html[+NetBeans IDE GUI Builder Visual Feedback Legend+]
* link:../docs/java/gui-image-display.html[+Handling Images in a GUI Application+]
* link:../docs/java/gui-filechooser.html[+Adding a FileChooser to a GUI Application+]
* link:../docs/java/gbcustomizer-basic.html[+Designing a Basic Java Form Using the GridBag Customizer+]
* link:../docs/java/gbcustomizer-advanced.html[+Designing an Advanced Java Form Using the GridBag Customizer+]

=== Java Database Applications, Beans Binding, and Persistence

* link:../70/java/gui-db.html[+Building a Java Desktop Database Application+]
* link:../docs/java/gui-binding.html[+Binding Beans and Data in a Desktop Application+]
* link:../docs/java/hibernate-java-se.html[+Using Hibernate in a Java Swing Application+]
* link:../docs/java/maven-hib-java-se.html[+Creating a Maven Swing Application Using Hibernate+]

=== Internationalization

* link:../docs/java/gui-automatic-i18n.html[+Internationalizing a GUI Form+]

== Screencasts

* link:../docs/java/gui-builder-screencast.html[+Designing a Swing GUI in NetBeans IDE+]

== Community-Contributed Docs

* link:http://netbeans.dzone.com/nb-ckeditor-javamail-tutorial[+How to Send Email via Java Mail 1.4.3 &amp; CKEditor with NetBeans IDE+] (by Robert Pieśnikowski)
* link:http://wiki.netbeans.org/SDIAppNetBeans[+Building an SDI Application with NetBeans+]
* link:http://wiki.netbeans.org/SimpleGUIBasedParser[+Simple GUI-based Parser using StringTokenizer+]
* link:http://wiki.netbeans.org/UsingNetbeansMatisseAndEclipseInParallel[+Using Netbeans Matisse And Eclipse In Parallel+]
* link:http://wiki.netbeans.org/UsingGUIEditor[+Using the GUI Editor+]

== Other Resources

* link:http://wiki.netbeans.org/NetBeansUserFAQ#GUI_Editor_.28Matisse.29[+GUI Editor FAQs+]
* link:http://download.oracle.com/javase/tutorial/uiswing/index.html[+ download.oracle.com Swing Tutorial+]
* link:https://netbeans.org/community/magazine/html/03/matisse/[+NetBeans Magazine: UI Design in NetBeans+]
