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

= Projetando uma GUI Swing no NetBeans IDE
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Projetando uma GUI Swing no NetBeans IDE - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Projetando uma GUI Swing no NetBeans IDE

Estes screencasts orientam pelo projeto de uma GUI do Swing no NetBeans IDE descrita no tutorial link:../java/quickstart-gui.html[+Projetando uma GUI do Swing no NetBeans IDE+].

Nos screencasts, você verá como adicionar, inserir, alinhar, redimensionar e recuar componentes para criar um layout de um front-end de GUI que permite exibir e editar informações de contato de indivíduos incluídos em um banco de dados de funcionários. Você aprenderá como usar com eficácia os recursos do GUI Builder do IDE.

|===
|
== Explorando o GUI Builder (.swf)

(Clique link:http://bits.netbeans.org/media/quickstart-gui-explore.swf[+aqui+] para exibir em tela cheia, Ctrl+Clique para fazer o download 1,9 MB)
Hora: 01:19

 

|
== Adicionando componentes individuais e múltiplos componentes (.swf)

(Clique link:http://bits.netbeans.org/media/quickstart-gui-add.swf[+aqui+] para exibir em tela cheia, Ctrl+Clique para fazer o download 5,6 MB)
Hora: 08:21

 

|
== Inserindo componentes (.swf)

(Clique link:http://bits.netbeans.org/media/quickstart-gui-insert.swf[+aqui+] para exibir em tela cheia, Ctrl+Clique para fazer o download 1,1 MB)
Hora: 01:49

 

|
== Alinhando e ancorando componentes (.swf)

(Clique link:http://bits.netbeans.org/media/quickstart-gui-align.swf[+aqui+] para exibir em tela cheia, Ctrl+Clique para fazer o download 4,4 MB)
Hora: 07:40

 

|
== Redimensionando e recuando componentes (.swf)

(Clique link:http://bits.netbeans.org/media/quickstart-gui-resize.swf[+aqui+] para exibir em tela cheia, Ctrl+Clique para fazer o download 4,1 MB)
Hora: 08:03

 
|===

Se estiver tendo problemas para exibir o screencast à direita, aguarde que o screencast seja submetido a download antes de iniciar.


== Links relacionados

* link:../intro-screencasts.html[+Tour em Vídeo Guiado do NetBeans IDE+]
* link:https://netbeans.org/kb/index.html[+Tutoriais do NetBeans IDE: Desenvolvimento Geral no Java+]
* link:https://netbeans.org/kb/index.html[+Documentação do NetBeans IDE+]
link:/about/contact_form.html?to=3&subject=Feedback:%20Designing%20a%20Swing%20GUI%20in%20NetBeans%20IDE%20Screencast[+Enviar Feedback neste Tutorial+]


