1.Swing概述

  Swing百分之百由Java本身实现,是一套轻量级组件(完全由Java实现的组件叫做轻量级套件,依赖于本地平台的套件称之为重量级套件)。Swing不再依赖于平台的GUI,因此真正做到了平台外观的一致性。

  但也因为Swing不再依赖平台,所以它的速度比AWT要慢。

2.Swing的优势

  1.Swing使用MVC(Module-View-Controller,即模型-视图-控制器)设计模式。

    模型(Module):用于维护组件的各种状态;

    视图(View):是组件可视化的表现;

    控制器(Controller):用于控制对各种事件、组件做出响应。

    

    当模型发生改变时,它会通知所有依赖它的视图,视图会根据模型数据来更新自己。Swing使用UI代理来包装视图和控制器,还有一个模型对象来维护该组件的状态。例如,按钮JButton有一个维护其状态信息的模型ButtonModel对象。Swing组件的模型是自动设置的,因此可以直接使用JButton而无需关心ButtonModule。

  2.Swing在各平台显示一致。

  3.Swing可以使用外观插件。

3.Swing组件层次

对应关系

  1.Swing中大部分直接或者间接继承自Java.awt.Container,因此既可以作为组件也可以作为容器。

  2.Swing中大部分组件都是直接在awt组件名前加一个J,但也有几个需要注意的:

    -JComboBox:对应awt中的Choice,但是功能更强。

    -JFileChooser:对应awt中的FileDialog

    -JScrollBar:对应awt中的Scrollbar

    -JCheckBox:对应awt中的Checkbox

    -JCheckBoxMenuItem:对应awt中的CheckboxMenuItem

功能层次

  1.顶层容器:JFrame、JWindow、JDialog、JApplet

  2.中间容器:JPanel、JScrollPane、JSplitPane、JToolBar等。

  3.特殊容器:在用户界面上具有特殊作用的中间容器,如JIntemalFrame、JRootPane、JLayeredPane、JDesktopPane等。

  4.基本组件:实现人机交互的组件,如JButton、JComboBox、JList、JMenu等。

  5.不可编辑信息的显示组件:向用户显示不可编辑信息的组件,如JLabel、JProgressBar、JToolTip等。

  6.可编辑信息的显示组件:向用户显示能被编辑的格式化信息的组件,如JTable、JTextArea、JTextField等。

  7.特殊对话框组件:可以直接显示特殊对话框的组件,如JColorChooser和JFileChooser等。

4.AWT组件的Swing实现

  Swing为除Canvas之外的所有AWT组件都提供了实现,Swing组件比AWT组件功能更加强大,相对于AWT组件,Swing组件有4个额外功能。

    1.可以为Swing组件设置提示信息,使用setToolTipText()方法,为组件设置对用户有帮助的提示信息。

    2.很多Swing组件,如按钮、标签、菜单项等,除了可以使用文字,还可以使用图标。为了允许使用图标,Swing为Icon接口提供了一个实现类ImageIcon,该实现类代表一个图像图标。

    3.支持插拔式的外观风格。每一个JComponent对象都有一个ComponentUI对象,为它完成所有绘画、事件处理、决定尺寸大小等工作。ComponentUI对象依赖于当前使用的PLAF,使用UIManager.setLookAndFeel()方法可以改变外观风格。

    4.支持设置边框。Swing组件可以设置一个或者多个边框,Swing提供了各种边框,用户也可以组合边框来自己设计边框。一种空白边框用于增大组件,同时协助布局管理器对容器内的组件进行合理布局。

  每一个Swing组件都有一个对应的UI类,如JButton有ButtonUI类来作为UI代理。每一个组件的UI类都是将组件的J去掉然后加UI后缀。UI代理通常是个抽象基类,不同的PLAF会有不同的UI代理实现类,Swing类库包含了几套UI代理分别放在了不同的包下,每套UI代理都几乎实现了所有组件的ComponentUI实现,每套这样的实现都被称为一种PLAF实现。

  

  1 import javax.swing.*;
2 import java.awt.event.ActionEvent;
3 import java.awt.event.ActionListener;
4 import java.awt.event.WindowAdapter;
5 import java.awt.event.WindowEvent;
6 import java.io.IOException;
7
8 public class SwingTestDemo1 {
9 //创建窗口
10 JFrame frame = new JFrame("Swing窗口程序");
11
12 //创建菜单栏
13 JMenuBar menubar = new JMenuBar();
14 JMenu fileMenu = new JMenu("文件");
15
16 JMenu editMenu = new JMenu("编辑");
17 JMenuItem auto = new JMenuItem("自动换行");
18 JMenuItem copy = new JMenuItem("复制");
19 JMenuItem paste = new JMenuItem("粘贴");
20
21 JMenu formatMenu = new JMenu("格式");
22 JMenuItem comment = new JMenuItem("注释");
23 JMenuItem uncomment = new JMenuItem("取消注释");
24
25 //创建文本域
26 JTextArea jta = new JTextArea(8,20);
27
28 //太丑了,我选择不要,留空
29 //创建颜色列表框
30 JList<String> colorList = new JList();
31
32 //创建选择相关组件
33 JComboBox<String> colorSelect = new JComboBox<>();
34
35 ButtonGroup sexGroup = new ButtonGroup();
36 JRadioButton male = new JRadioButton("男",true);
37 JRadioButton female = new JRadioButton("女",false);
38
39 JCheckBox isMarried = new JCheckBox("是否已婚?", false);
40
41 //创建底部
42 JTextField textField = new JTextField(20);
43 JButton submit = new JButton("Submit");
44
45 //创建右键菜单
46 JPopupMenu popMenu = new JPopupMenu();
47
48 ButtonGroup PopButtonGroup = new ButtonGroup();
49 JRadioButtonMenuItem metal = new JRadioButtonMenuItem("metal风格");
50 JRadioButtonMenuItem nimbus = new JRadioButtonMenuItem("nimbus风格");
51 JRadioButtonMenuItem windows = new JRadioButtonMenuItem("windows风格");
52 JRadioButtonMenuItem windowsClassic = new JRadioButtonMenuItem("windows经典风格");
53 JRadioButtonMenuItem motif = new JRadioButtonMenuItem("motif风格");
54
55 public void init(){
56 //组装底部
57 JPanel ButtonPanel = new JPanel();
58 ButtonPanel.add(textField);
59 ButtonPanel.add(submit);
60
61 //组合中部下部
62 Box CDown = Box.createVerticalBox();
63
64 JPanel centerPanel = new JPanel();
65
66 //创建颜色选项
67 centerPanel.add(colorSelect);
68 colorSelect.addItem("红色");
69 colorSelect.addItem("绿色");
70 colorSelect.addItem("蓝色");
71
72
73 sexGroup.add(male);
74 sexGroup.add(female);
75 centerPanel.add(male);
76 centerPanel.add(female);
77 centerPanel.add(isMarried);
78
79 CDown.add(centerPanel);
80 CDown.add(ButtonPanel);
81
82 //组合上部左右
83 Box Top = Box.createHorizontalBox();
84 Top.add(jta);
85 Top.add(colorList);
86
87 //组合菜单栏
88 //组合格式化菜单
89 formatMenu.add(comment);
90 formatMenu.add(uncomment);
91
92 //组合编辑菜单
93 editMenu.add(auto);
94 editMenu.addSeparator();
95 editMenu.add(copy);
96 editMenu.add(paste);
97 editMenu.addSeparator();
98 editMenu.add(formatMenu);
99
100 //组合菜单栏
101 menubar.add(fileMenu);
102 menubar.add(editMenu);
103
104 //组合右键菜单
105 PopButtonGroup.add(metal);
106 PopButtonGroup.add(nimbus);
107 PopButtonGroup.add(windows);
108 PopButtonGroup.add(windowsClassic);
109 PopButtonGroup.add(motif);
110
111 popMenu.add(metal);
112 popMenu.add(nimbus);
113 popMenu.add(windows);
114 popMenu.add(windowsClassic);
115 popMenu.add(motif);
116
117
118
119 //添加到窗口
120 frame.add(popMenu);
121 //组合整个界面
122 Box mainBox = Box.createVerticalBox();
123 mainBox.add(Top);
124 mainBox.add(CDown);
125 frame.add(mainBox);
126 frame.setJMenuBar(menubar);
127
128 //设置最佳大小
129 frame.pack();
130 //设置可见
131 frame.setVisible(true);
132
133 //设置右键监听
134 ActionListener RightMouse = new ActionListener() {
135 @Override
136 public void actionPerformed(ActionEvent e) {
137 String command = e.getActionCommand();
138 try {
139 changePLAF(command);
140 } catch (IOException ioException) {
141 ioException.printStackTrace();
142 } catch (ClassNotFoundException classNotFoundException) {
143 classNotFoundException.printStackTrace();
144 } catch (UnsupportedLookAndFeelException unsupportedLookAndFeelException) {
145 unsupportedLookAndFeelException.printStackTrace();
146 } catch (InstantiationException instantiationException) {
147 instantiationException.printStackTrace();
148 } catch (IllegalAccessException illegalAccessException) {
149 illegalAccessException.printStackTrace();
150 }
151 }
152 };
153
154 //注册右键监听器
155 metal.addActionListener(RightMouse);
156 nimbus.addActionListener(RightMouse);
157 windows.addActionListener(RightMouse);
158 windowsClassic.addActionListener(RightMouse);
159 motif.addActionListener(RightMouse);
160
161 //设置鼠标事件
162 mainBox.setComponentPopupMenu(popMenu);
163
164 //添加关闭功能
165 frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
166 }
167
168 //添加改变外观的方法
169 private void changePLAF(String Command) throws IOException, ClassNotFoundException, UnsupportedLookAndFeelException, InstantiationException, IllegalAccessException {
170 switch (Command){
171 case "metal风格":
172 UIManager.setLookAndFeel("javax.swing.plaf.MetalLookAndFeel");
173 break;
174 case "nimbus风格":
175 UIManager.setLookAndFeel("javax.swing.plaf.NimbusLookAndFeel");
176 break;
177 case "windows风格":
178 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
179 break;
180 case "windows经典风格":
181 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
182 break;
183 case "notif风格":
184 UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
185 break;
186 }
187
188 SwingUtilities.updateComponentTreeUI(frame.getContentPane());
189 SwingUtilities.updateComponentTreeUI(menubar);
190 SwingUtilities.updateComponentTreeUI(popMenu);
191 }
192 public static void main(String[] args) {
193 new SwingTestDemo1().init();
194 }
195 }

Swing01-概述的更多相关文章

  1. 【AR实验室】ARToolKit之概述篇

    0x00 - 前言 我从去年就开始对AR(Augmented Reality)技术比较关注,但是去年AR行业一直处于偶尔发声的状态,丝毫没有其"异姓同名"的兄弟VR(Virtual ...

  2. Recurrent Neural Network系列1--RNN(循环神经网络)概述

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

  3. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  4. .Net 大型分布式基础服务架构横向演变概述

    一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...

  5. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

  6. 【基于WinForm+Access局域网共享数据库的项目总结】之篇一:WinForm开发总体概述与技术实现

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

  7. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  8. [AlwaysOn Availability Groups]健康模型 Part 1——概述

    健康模型概述 在成功部署AG之后,跟踪和维护健康状况是很重要的. 1.AG健康模型概述 AG的健康模型是基于策略管理(Policy Based Management PBM)的.如果不熟悉这个特性,可 ...

  9. μCos-ii学习笔记1_概述

    一.μCos-ii _概述 网上关于μCosii的文章多不胜数,本人学习的过程中也参考了很多人的理解和想法,看的是卢有亮老师的<嵌入式实时操作系统-μC/OS原理与实践>(第2版),同时也 ...

  10. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

随机推荐

  1. 干货 MySQL常见的面试题 + 索引原理分析

    常见的面试必备之MySQL索引底层原理分析: MySQL索引的本质 MySQL索引的底层原理 MySQL索引的实战经验 面试 1)问题:数据库中最常见的慢查询优化方式是什么? 回答:加索引 2)问题: ...

  2. FairyGUI编辑器的和unity里的Obj对应关系

    1.在FairyGUI官网上下载好unity的工程,用FairyGUI编辑器打开它的官方案例 2.在FairyGUI编辑器和Unity中,从一个最简单的示例"Bag"着手.     ...

  3. [原题复现][极客大挑战 2019]HardSQL(updatexml报错注入)

    简介  原题复现:  考察知识点:SQL注入(报错注入,绕过过滤)  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台 特别感谢!) 榆林学院内可使用信安协会内部的CTF训练平 ...

  4. Camtasia中对录制视频进行编辑——行为

    小视频的逐渐兴起,让我们的生活变得多姿多彩,同时,也造就了一批新媒体的创业者还有越来越多的网红,这不禁使我们也想加入他们的行列.但是问题来了,拍摄视频后最重要的是对视频进行剪辑,没有一款经济适用的软件 ...

  5. FL Studio录制面板作用介绍

    在上一节教程中我们详细的讲解了一下FL Studio录制面板菜单的一些功能,今天我们将继续讲解该面板的知识.具体内容小编这里就不多说了,还是一起来看看吧! 1.录音倒数.该按钮在打开的情况下会在录音前 ...

  6. DFS序专题

    牛客专题之DFS序 简介 dfs序: 每个节点在dfs深度优先遍历中的进出栈的时间序列,也就是tarjan算法中的dfn数组. 画个图理解一下: 这棵树的dfs序:1 3 2 4 2 5 6 7 6 ...

  7. CF1156D 0-1-Tree

    路径考虑顺序. 显然合法的路径只有以下两种: 一段 \(0\) 加一段 \(1\) 或一段 \(1\) 加一段 \(0\). 全 \(0\) 或全 \(1\). 用并查集将边权为 \(0\) 和 \( ...

  8. LeetCode周赛#205

    5508. 数的平方等于两数乘积的方法数 #模拟 #哈希表 题目链接 题意 给你两个整数数组nums1 和 nums2 ,请你返回根据以下规则形成的三元组的数目(类型 1 和类型 2 ): 类型 1: ...

  9. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...

  10. Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件

    首先说一下,这里解决的问题应用场景: sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQ ...