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. SpringBoot WebSocket 消息交互

    1. Websocket原理 Websocket协议本质上是一个基于TCP的独立协议,能够在浏览器和服务器之间建立双向连接,以基于消息的机制,赋予浏览器和服务器间实时通信能力. WebSocket资源 ...

  2. PHP反序列化漏洞-CVE-2016-7124(绕过__wakeup)复现

    前言 最近电脑也不知怎么了时不时断网而且我竟然找不出原因!!!很诡异....  其他设备电脑都OK唯独我的电脑 时好时坏 我仿佛摸清了我电脑断网的时间段所以作息时间都改变了  今天12点多断网刷了会手 ...

  3. RSA脚本环境配置-攻防世界-OldDriver

    [Crypto] 题目链接 [RSA算法解密] 审题分析 首先拿到一个压缩包,解压得到文件enc.txt. 先不用去管其他,第一眼enc马上联想到 RSA解密.接着往下看 [{"c" ...

  4. 怎么在苹果笔记本上用Folx重新下载已完成的任务

    大家在完成了任务下载后,有时会将下载的文件移动到其他文件夹中,或者是,当下载的文件已经使用完毕时,有些用户会将文件删除.以上的两种情况,都会导致Folx所属任务查看功能失效,也就是说,无法找到任务对应 ...

  5. 用CorelDRAW来制作产品结构图的方法

    一.产品结构图的重要性 随着我国经济不断的高速发展,大家的生活水平不断提高,我们将会在生活生产中越来越多的,遇到许多各种各样的生产产品和生活消费品.科技的飞速进步,更是使这些产品.消费品包含了很强的科 ...

  6. 如何用ABBYY FineReader 识别表格

    ABBYY FineReader有着强大的OCR文字识别功能,不但可以将文件转换为文本文档或Word文档,也可以识别PDF文件或者图片上的表格,并且转换为Excel文件. 下面小编就使用ABBYY F ...

  7. Java蓝桥杯——贪心算法

    贪心算法 贪心算法:只顾眼前的苟且. 即在对问题求解时,总是做出在当前看来是最好的选择 如买苹果,专挑最大的买. 最优装载问题--加勒比海盗 货物重量:Wi={4,10,7,11,3,5,14,2} ...

  8. 蓝桥杯——复数幂 (2018JavaAB组第3题)

    18年Java蓝桥杯A组第3题和B组是一样的. 第三题往往比较难. 复数幂 (18JavaAB3) (A.B两卷第三题一样) 设i为虚数单位.对于任意正整数n,(2+3i)^n 的实部和虚部都是整数. ...

  9. 【JVM】jdk1.8移除方法区与metaspace

    转载:https://blog.csdn.net/aa747604141/article/details/52673582 https://www.jianshu.com/p/a6f19189ec62

  10. 推荐系统实践 0x09 基于图的模型

    用户行为数据的二分图表示 用户的购买行为很容易可以用二分图(二部图)来表示.并且利用图的算法进行推荐.基于邻域的模型也可以成为基于图的模型,因为基于邻域的模型都是基于图的模型的简单情况.我们可以用二元 ...