一、前言

话说都 2022 年了,为啥还有项目在使用 Swing 来开发界面?

我百思不得其解,毕竟从我接触 Java 到现在,就没有看过 Swing 相关的任何东西。Thinking in Java 这本书,每次读都是很自觉的跳过 Swing 那一章。对于 Java 工程师来说,能涉及到 UI 交互的系统,绝大部分都是 web 项目。而 JSP 都已经落伍了,前后端都分离多少年了,这时候让我用 Swing 来写一个页面?

当然,为了生存,我还是不得不对老板说,我之前没接触过 Swing,一点也不会啊,但是没关系,我可以学。

其实存在即合理,在互联网行业待了这么久,自然是不知道有很多传统行业因为各种原因还在使用CS架构,而面对这些维护了十好几年的系统,你就不得不跳入 Swing 的深坑。

那么新问题又来了,都 2022 年了,为啥还会有人在准备写一个 Swing 的系列文章?

因为在我边学边划拉页面的过程,实在是太痛苦了。能搜索到的 Swing 的内容确实不多,能查到的内容,也都是很简单的样式展示。再加上不是什么主流的技术,没有什么很好的教程,所以只能扒源码的注释、尝试 set 各种属性看效果、找规律、翻古老系统里有没有可借鉴的用法。也是煎熬了两三周,算是对 Swing 入门了。

所以我想写这个系列文章,一方面是总结最近学到的“全新的”知识点,另一方面是能填补一些 Swing 相关的教程和文章的缺口,帮助少有的在 Swing 深坑中摸爬滚打的朋友们,一起沉默前行。

文章中涉及到的代码都会上传到 GitHub 上,项目地址:https://github.com/tinybye/someSwingDemos

二、啥是Swing

Swing 是 Java 的 GUI 库,Java 开发人员可以通过 Swing 来绘制客户端的界面。

这解答了我心中的一个疑惑,之前在网上看到 Java 前端工程师的招聘,当时就想,为啥Java会有前端工程师……

具体的概念后面再说,我们先搞一个 demo 出来,看看效果。之后对照着 demo 来慢慢讲解我们需要掌握的概念。

三、先写一个简单的窗口

程序员的惯例,一开始都要写个 Hello world,如图:

源码如下:

/*** 只有hello world的窗口** @author tinybye* @date 2022/9/6*/
public class SimpleFrame extends JFrame {public SimpleFrame(String title) {super(title);JLabel label = new JLabel("Hello world!");add(label);// 指定窗口位置与大小setBounds(300, 100, 400, 200);// 显示窗口setVisible(true);}public static void main(String[] args) {new SimpleFrame("我是一个窗口");}
}

下面我们一边看代码,一边介绍这个 demo 中涉及到的概念。

代码很简单,我们写了一个SimpleFrame子类来继承JFrame

这里我们涉及到了第一个概念——容器。

当你想运行一个 Swing 写的 Java 图形化程序时,你需要有一个窗口来承载各种按钮、文本、列表等信息。而这个窗口(Window类)就是一个容器。

JFrame类继承了Window类,它是一个最常见最基础的容器,带 GUI 的应用程序至少要使用一个JFrame**。**你可以这样简单理解:如果你想启动一个图形化程序,你必须要创建一个JFrame对象。

接下来,构造方法的入参指定了这个窗口的标题。在构造方法里,我们指定了该框架的大小、显示的位置,并且在里面添加了一个文本为“Hello world!”的JLabel(标签)。

这里就是我们涉及到的第二个概念——组件。

一段文本、一个按钮、一个列表、一个下拉框,都是一个组件。你的容器承载着一堆组件,展示在你的面前,成为一个图形化程序。

组件们都继承了JComponent类。

构造方法里填充了这个页面的全部信息后,我们在main方法里创建一个SimpleFrame对象,一个有界面的 Java 程序就启动了,我们绘制的窗口就出现在了屏幕上。

四、一个有交互的例子

上面的只是一个展示窗口的非常简单的例子,现在我们再写一个有交互的 demo。

主窗口有一个按钮,以及文案,如图:

点击按钮之后,会弹出一个弹窗,随后,主窗口的点击次数会随之增加:

源码如下:

/*** 一个有交互的窗口** @author tinybye* @date 2022/9/6*/
public class ClickFrame extends JFrame {int count = 0;public ClickFrame(String title) {super(title);JLabel label = new JLabel("点击次数:" + count);JButton button = new JButton("点我");// 按钮监听事件button.addActionListener(e -> {count++;label.setText("点击次数:" + count);// 弹出一个简易的dialog对话框JOptionPane.showMessageDialog(null, "别点了,别点了!");});// 设置布局,这里使用流式布局setLayout(new FlowLayout());// 标签和按钮都添加进窗口add(label);add(button);// 指定窗口位置与大小setBounds(300, 100, 200, 100);// 显示窗口setVisible(true);}public static void main(String[] args) {new ClickFrame("一个有交互的窗口");}
}

这个例子可谓是麻雀虽小五脏俱全了,设计的要素丰富了很多,有按钮,有 JLabel,有布局,有触发事件,还有新的容器 Dialog。

接下来我们就跟着代码一起,接触一下新的概念吧。

我们在窗口里放置了一个 JLabel 和一个按钮,这俩都是组件。按钮这个东西,肯定是可以点击的。我们通过addActionListener方法为按钮增加一个监听器来监听按钮的点击动作,进而可以触发一个事件来实现点击按钮的交互。

这个事件里,我们做了三件事:记录点击次数、刷新JLabel以及弹出一个对话框,这个对话框是一个JDialog

JDialogJFrame一样,也是一个容器。JFrame是一个窗口,JDialog是一个对话框。作为对话框,相对来说要简单一些。

之后使用setLayout方法给窗口指定了布局管理器为FlowLayout流式布局管理器。

一个新概念,布局管理器又是啥?

当一个窗口里有多个组件时,我们需要管理这些组件的摆放位置,这就是布局管理器的作用。

常用的布局管理器有很多种,有边框布局管理器、流式布局管理器等等,不同的布局管理器适用于不同类型页面的布局,可以分情况使用。代码里使用的是流式布局管理器,组件会按照从左到右,从上到下的顺序排列。

五、容器、组件和布局

本文主要是通过两个例子来介绍一下 Swing 最常见的几个概念,初步的认识一下一个简单且完整的 Swing 程序是什么样的。

在这里总结一下,今天涉及到的容器、组件和布局的概念。

1.容器

一个有界面的 Swing 程序,需要一个容器来承载这个界面上的各个元素。常见的容器类有JFrameJDialog

JFrame会展示一个窗口,一个图形化的 Swing 程序必须要依赖一个JFrame

JDialog是一个对话框,作为一个弹框,可以显示一些简单的信息。

2.组件

你在界面上看到的所有元素,比如:标签、按钮、文本框、下拉框等等,都是组件。我们通过把组件摆放到容器中,来生成一个你想要的页面。

组件的信息是可以动态变化的(比如第二个例子中 JLabel 的文案改变),其中有的组件也可以监听事件触发逻辑(比如点击按钮后展示弹窗)。

3.布局

如何让容器中的组件整齐清晰的按照你的想法摆放到正确的位置,是布局管理器要做的事情。不同的布局管理器会让组件按照不同的布局来展示。

本文只是简单介绍了流式布局管理器,更多的布局管理器,会在后续的文章中详细介绍。

其实刚接触 Swing 的时候,两眼一抹黑,并且感觉这种用代码定位而不是拖拽控件的方式实在是太反人性太繁琐了。不过接触了一段时间,发现 Swing 的整体设计真不赖,很多地方都是有规律可循的。给自己打打气吧,希望这个系列的文章更新完毕后,对 Swing 的使用就能游刃有余了。

第一章 初探Swing相关推荐

  1. jBPM3.12用户指南中文翻译----第一章 绪论

    这是Jboss 的jBPM3.12框架的用户指南的中文翻译.其中第一章的译文,是我在网上找到的.其他几章都是我自己做的翻译.我的翻译是中英文对照,只翻译部分我认为重要的,不翻译简单的英文,以免浪费你我 ...

  2. 第一章 计算机、程序和Java概述 复习题 解答

    第一章 计算机.程序和java概述 复习题 1.2~1.4节 1.1给出硬件和软件的定义 解:一般来说,硬件包括计算机中可以看得见的物理部分,而软件提供看不见的指令,这些指令控制硬件并且要求硬件完成特 ...

  3. Java初级笔记-第一章

    第一章 Java概览 1.1 基本简介 Java是一种理想的面向对象的网络编程语言. 1991年,出现了Oak语言,旨在解决编程语言的选择和跨平台的问题. 1994年,随着Internet的迅猛发展, ...

  4. 《深入理解Java虚拟机》-周志明 -第3版-第一章摘记

    第一章讲了java的发展和变迁,在章节末作者讲到了编译openjdk源码和调试源码 java发展史 java的诞生起因史1991年4月,James Gosling博士领导的绿色计划(Green Pro ...

  5. 第一章 认识Java 2019-09-28

    (2)JavaSE 核心技术 主要包括:认识Java.变量和运算符.流程控制语句.数组.方法.面向对象基础.面向对象高级特性.异常处理.工具类.集合.IO/NIO.多线程编程.JDK8.0新技术,JD ...

  6. 管理学计算机要求,[管理学]计算机第一章.ppt

    [管理学]计算机第一章 医学计算机应用基础 计算机教研室 第1章 计算机与信息技术 1.1 计算机.信息与社会 1.2 计算机内信息的表示与编码 1.3 计算机硬件组成及其工作原理 1.4 计算机软件 ...

  7. 作业答案解析:尚学堂Java300集 第一章

    写在前面:大家好,我是草莓橙须圆.毕业之前在CSDN和微信公众号活跃 欢迎关注我的公众号:草莓橙须圆 , 微信号(cmcxy8w) 微信公众号主要就是更新一些日常和有用的小工具 CSDN主要就是学习J ...

  8. Java 学习笔记:第一章 Java入门

    Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...

  9. 第一章 corejava的入门

    第一章 corejava的入门 一:什么是语言 语言=os+数据结构+算法+思想 os:操作系统 数据结构:队,栈,二叉树,链表 算法:做游戏开发时非常重要 面试题:int a>0,b>0 ...

最新文章

  1. Jmeter性能测试之后置处理器Json提取器的使用
  2. 能运行shell吗_terminal, shell, bash, zsh
  3. c# webclient 保存会话信息_会话保持机制cookie和session
  4. 自动驾驶——标注工具(js+electron)的开发笔记(基于Create-React-App)
  5. java.util.function包下的四大Function
  6. 快速稳定下载googledrive文件
  7. 这款桌面分区软件太好用了
  8. Java正则表达式语法规则(具体)
  9. spring boot 在fastdfs文件上传大小限制
  10. android 遮罩窗口,Andriod PopupWindow 实现遮罩效果
  11. 教你如何用ps美化皮肤 每一步都很容易理解!
  12. 论文阅读学习 - 深度学习网络模型分析对比
  13. 用飞信批量加好友——解放鼠标,更解放你的手!
  14. 本题要求递归实现一个计算X的N次方 (n≥1)的函数。
  15. 【高等数学】不定积分
  16. oracle 500错误,oracle - FRM-50016法律字符是0-9 - + E错误Oracle表单 - 堆栈内存溢出
  17. 抖音搜索seo代理,优化排名
  18. 动态规划报告(树形DP+概率DP
  19. 计算机系统仪表特点,一个大型计算机系统的特点
  20. 基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制, 坐标变换,电流环,速度环,位置环,电机反馈接口,SVPWM 都是通过Verilog 语言来实现的

热门文章

  1. 力扣(718.1143)补9.12
  2. mac m1上esc键失灵不能退出vi解决方法
  3. 心流体验:专注的快乐--读书笔记
  4. 广东诚美计算机专修学院 概况,广州各大高校
  5. Java核心知识:面向对象-多态
  6. 一文读懂5G R16标准究竟讲了些什么
  7. vue项目对接钉钉企业内部H5微应用
  8. 祭奠我死去的CET-6
  9. LDO和BUCK降压稳压器对比
  10. 梁漱溟:年轻人的焦虑,在于把欲望当做志气