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

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

以下截屏视频将指导您在 NetBeans IDE 中设计 Swing GUI，如link:../java/quickstart-gui.html[+在 NetBeans IDE 中设计 Swing GUI+] 所述。

在这些截屏视频中，您将观看到如何添加、插入、对齐和缩进组件并调整其大小以设置 GUI 前端布局，以便查看和编辑员工数据库中包含的各员工的联系信息。此外，您还将了解如何有效地使用 IDE GUI 构建器的功能。

|===
|
== 了解 GUI 构建器 (.swf)

（单击link:http://bits.netbeans.org/media/quickstart-gui-explore.swf[+此处+]以查看全图，按住 Ctrl 键单击即可下载，大小为 1,9 MB）
播放时长：01:19

 

|
== 添加单个和多个组件 (.swf)

（单击link:http://bits.netbeans.org/media/quickstart-gui-add.swf[+此处+]以查看全图，按住 Ctrl 键单击即可下载，大小为 5,6 MB）
播放时长：08:21

 

|
== 插入组件 (.swf)

（单击link:http://bits.netbeans.org/media/quickstart-gui-insert.swf[+此处+]以查看全图，按住 Ctrl 键单击即可下载，大小为 1,1 MB）
播放时长：01:49

 

|
== 对齐和锚定组件 (.swf)

（单击link:http://bits.netbeans.org/media/quickstart-gui-align.swf[+此处+]以查看全图，按住 Ctrl 键单击即可下载，大小为 4,4 MB）
播放时长：07:40

 

|
== 缩进组件和调整其大小 (.swf)

（单击link:http://bits.netbeans.org/media/quickstart-gui-resize.swf[+此处+]以查看全图，按住 Ctrl 键单击即可下载，大小为 4,1 MB）
播放时长：08:03

 
|===

如果观看右侧的截屏视频时遇到问题，则可以先下载该截屏视频，然后再观看。


== 相关链接

* link:../intro-screencasts.html[+NetBeans IDE 的指导性视频演示+]
* link:https://netbeans.org/kb/index.html[+NetBeans IDE 教程：常规 Java 开发+]
* link:https://netbeans.org/kb/index.html[+NetBeans IDE 文档+]
link:/about/contact_form.html?to=3&subject=Feedback:%20Designing%20a%20Swing%20GUI%20in%20NetBeans%20IDE%20Screencast[+发送有关此教程的反馈意见+]


