使用Swing的GUI编程
Swing
AWT概述
- AWT:抽象窗口工具包,提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具
- Swing以AWT为基础的,尽管Swing消除了AWT固有的大量限制,但Swing不是用来代替AWT的。Swing使用了与AWT相同的事件处理机制;所以使用Swing需要对AWT以及事件处理有一个基本了解
两个关键的Swing特性
- 轻量级组件
- 可插入外观
Swing包含的内容
- 容器
- 组件
- 可改变的外观
- Java2D图形绘制
Swing容器
容器类型
顶层容器(重量级)
- JFrame
- JApplet
- JDialog
- JWindow
- 继承自Component和Container
注意:每个应用程序至少有一个顶层容器,也就是我们说的窗口
中间容器
- JPanel
- JScrollPane
- JSplitPane
- 继承自JComponent
顶层容器JFrame窗体的层次结构
- JFrame窗体的底层是RootPane(javax.swing.JRootPane)
- RootPane包含GlassPane和LayeredPane
GlassPane
- 是一个透明面板,主要功能是捕获JFrame上的任何事件
- JGlassPane的默认值是不可看见的,不过可以设为看见的(visible)
LayeredPane
- 是一个可以重叠组件的面板,本身就是一个容器
- ContentPane是LayeredPane中的一层,一般视为最底层,也是最常用,最重要的容器。通常我们会将组件放在ContentPane上,而不会加在LayeredPane上
示例:
import javax.swing.JFrame;
public class FirstSwingDemo {
public static void main(String[] args) {
JFrame jf = new JFrame("第一个Swing窗口");//创建一个Java预定义的窗体
/*方法1:setSize(int newWidth, newHeight)*/
jf.setSize(400,480);//设置窗体的大小
/*方法2:setSize(Dimension newSize)*/
Dimension d = new Dimension(100,100);
jf.setSize(d);
jf.setVisible(true);//设置窗体是否可见
}
}
JFrame窗口参数
| 方法 | 描述 |
|---|---|
| setSize(int newWidth, int newHeight) / setSize(Dimension newSize) | 设置窗体大小 |
| setVisible(boolean visibleFlag) | 设置窗体是否可见 |
| setTitle(String newTitle) | 设置窗体标题 |
面板(JPanel)
- JPanel类是Java GUI工具包Swing中的面板容器类,是一种轻量级的容器
- 可以加入到JFrame窗体中,自身可以嵌套使用,主要功能是对窗体中的组件进行组织
- 其他Swing组件可以通过调用add()方法添加到面板容器对象中
- 一旦添加,就可以使用Component类定义的setLoacation()、setSize()、setBounds()方法手动布局和调整
- JPanel默认布局是FlowLayout(流布局),如果需要手动布局,需要使用setLayout()方法修改布局方式
示例(给窗体添加一个面板)
import java.awt.Color;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class FirstSwingDemo {
public static void main(String[] args) {
JFrame jf = new JFrame("第一个Swing窗口");//创建一个Java预定义的窗体
jf.setSize(400,480);//设置窗体的大小
jf.setVisible(true);//设置窗体是否可见
JPanel jp = new JPanel();//创建一个面板容器对象
Container container = jf.getContentPane();//将JPanel对象添加到父容器中
container.setLayout(null);//设置布局
container.add(jp);//添加组件
/**
* 设置布局和大小
*/
jp.setSize(100,100);
jp.setLocation(50,50);
/**
* 设置背景色
*/
jp.setBackground(Color.black);
}
}
Swing GUI组件
标签(JLabel)
- JLabel是最容易使用的Swing组件,用来创建标签
- 最常用的构造方法是:
- JLabel(String str):str用于标签的文本
- JLabel(Icon icon):icon用于标签的图标;获取图标最容易的方式是使用ImageIcon类,它实现了Icon,所以可以将ImageIcon类型的对象作为参数传递给JLabel构造方法的Icon参数
JLabel jl = new JLabel("第一个标签");
jf.getContentPane().add(jl,BorderLayout.CENTER);
//显示图片
JLabel jl = new JLabel(new ImageIcon("icon.jpg"));
jf.getContentPane().add(jl);
文本输入框(JTextField)
- Swing的文本组件,通过它可以编辑一行文本,也可以响应用户交互事件
示例:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class FirstSwingDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("第一个Swing窗口");//创建一个Java预定义的窗体
Dimension d = new Dimension(400,200);
frame.setSize(d);
/**
* 添加一个用于显示的标签
*/
JLabel label = new JLabel();
label.setPreferredSize(new Dimension(d.width,60));
frame.getContentPane().add(label,BorderLayout.NORTH);
/**
* 添加文本输入框
*/
JTextField text = new JTextField();
text.setPreferredSize(new Dimension(d.width,60));
/**
* 添加文本输入框Enter事件
*/
text.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText(text.getText());
}
});
frame.getContentPane().add(text,BorderLayout.CENTER);
frame.setVisible(true);
}
}
按钮(JButton)
- JButton
- JToggleButton
- JCheckBox
- JRadioButton
以上这些都是AbstractButton的子类,包含了许多用于控制按钮行为的方法。如下:
- void setDisableIcon(Icon di)
- void setPressedIcon(Icon pi)
- void setSelectedIcon(Icon si)
- void setRolloverIcon(Icon ri)
通过以下方法可以获取和修改关联的文本内容:
- String getText()
- void setText(String str)
示例:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class SecondSwingDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("这是按钮的练习");
Dimension d = new Dimension(400,200);
frame.setSize(d);
JLabel label = new JLabel();
label.setPreferredSize(new Dimension(d.width,60));
frame.getContentPane().add(label,BorderLayout.NORTH);
/**
* 添加按钮
*/
JButton button = new JButton("按钮");
button.setPreferredSize(new Dimension(d.width,60));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText("测试一下按钮");
}
});
frame.getContentPane().add(button,BorderLayout.SOUTH);//在窗体中增加按钮
frame.setVisible(true);//显示窗体
}
}
组合框(JComboBox)
- Swing通过JComboBox类来提供组合框(文本域与下拉列表组合)
- 组合框通常显示一个条目,但也可以显示一个允许用户从中选择不同条目的下拉列表
- 还可以创建允许用户在文本域中输入选项的组合框
- 从JDK7开始,JComboBox设计成泛型类:class JComboBox
- 可以通过addItem()方法添加到下拉列表中
- 可以通过setSelectedItem()方法设置当前被选中的条目
- 通过getSelectedItem()方法获取当前被选中的条目
示例:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class ThirdSwingDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("这是组合框的测试");
Dimension d = new Dimension(400,200);
frame.setSize(d);
frame.setLayout(null);
ArrayList<String> cars = new ArrayList<>();
cars.add("哈弗");
cars.add("吉利");
cars.add("大众");
cars.add("本田");
cars.add("长安");
/**
* 创建下拉菜单
*/
JComboBox<String> box = new JComboBox<>();
box.setBounds(d.width/2-100,d.height/2-60,200,60);
/**
* 添加下拉菜单内容
*/
for(String brands : cars) {
box.addItem(brands);
}
box.setSelectedItem(cars.get(4));//设置当前选中的选项
frame.getContentPane().add(box,BorderLayout.CENTER);
frame.setVisible(true);
}
}
布局管理器(LayoutManager)
BorderLayout类
- 布置容器的边框布局管理器
- 可以对容器组件进行安排,并调整其大小,使其符合五个区域:东、南、西、北、中
- 每个区域只能包含一个组件
边框布局示例:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
public class FourthSwingDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("BorderLayout示例");
Dimension d = new Dimension(400,200);
frame.setSize(d);
BorderLayout layout = new BorderLayout();
Container panel = frame.getContentPane();
panel.setLayout(layout);
Font font = new Font("黑体",Font.BOLD,24);
JButton north = new JButton("北");
north.setFont(font);
panel.add(north,BorderLayout.NORTH);
JButton south = new JButton("南");
south.setFont(font);
panel.add(south,BorderLayout.SOUTH);
JButton west = new JButton("西");
west.setFont(font);
panel.add(west,BorderLayout.WEST);
JButton east = new JButton("东");
east.setFont(font);
panel.add(east,BorderLayout.EAST);
JButton center = new JButton("中");
center.setFont(font);
panel.add(center,BorderLayout.CENTER);
frame.setVisible(true);
}
}
FlowLayout类
布置容器的流布局管理器
具有指定的对齐方式以及指定的水平和垂直间隙
align参数的值必须为以下的值之一:
FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER、FlowLayout.LEADING、FlowLayout.TRAILING
流布局示例:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class FlowLayoutDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("FlowLayout示例");
Dimension d = new Dimension(1280,1080);
frame.setSize(d);
JPanel panel = new JPanel();
panel.setBackground(new Color(200,200,200));
FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
panel.setLayout(layout);
frame.getContentPane().add(panel,BorderLayout.CENTER);
for(int i = 0; i < 2; i++) {
ImageIcon icon = new ImageIcon("myfinder.png");
JLabel label = new JLabel(icon);
label.setPreferredSize(new Dimension(
icon.getIconWidth(),icon.getIconHeight()));
panel.add(label);
}
JButton button = new JButton("窗体减半");
button.setFont(new Font("微软雅黑",Font.PLAIN,24));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panel.setSize(new Dimension(
panel.getWidth()/2,panel.getHeight()));
panel.doLayout();
}
});
panel.add(button);
frame.setVisible(true);
}
}
GridLayout类
- 布置容器的网格布局管理器
- 将容器划分成网络,组件可以按行和列排列
- 在网格布局管理器中,每一个组件的大小相同
- 网格中空格个数由网格行数和列数决定
- 组件从网格的左上角开始,从左往右,从上往下的顺序加入到网格中
- 每一个组件都会填满整个网格,改变窗体大小,组件大小也会随之改变
GridLayout示例:
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GridLayoutDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("FlowLayout示例");
Dimension d = new Dimension(680,500);
frame.setSize(d);
JPanel gridPanel = new JPanel();
int rowMax = 5;
int colMax = 4;
gridPanel.setLayout(new GridLayout(rowMax,colMax));
frame.getContentPane().add(gridPanel);
String[][] signal = {
{"(",")","%","C"},
{"1","2","3","+"},
{"4","5","6","-"},
{"7","8","9","*"},
{"0",".","=","/"}
};
for (int i = 0; i < rowMax; i++) {
for(int j = 0; j < colMax; j++) {
JButton button = new JButton();
button.setFont(new Font("微软雅黑",Font.BOLD,54));
button.setText(signal[i][j]);
gridPanel.add(button);
}
}
frame.setVisible(true);
}
}
在Swing中绘图
组件绘制
渐变色面板示例:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class GradientPanel extends JPanel{
public GradientPanel(BorderLayout borderLayout) {
super(borderLayout);
}
@ Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(!isOpaque()) {
return;
}
int width = this.getWidth();
int height = this.getHeight();
Graphics2D g2 = (Graphics2D)g;
GradientPaint grandientPaint = new GradientPaint(
width/4,
height/4,
Color.red,
width,
height,
Color.blue,
false);
g2.setPaint(grandientPaint);
g2.fillRect(0, 0, width, height);
}
public static void main(String[] args) {
JFrame frame = new JFrame("渐变色面板示例");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(500,400);
GradientPanel grandientPanel = new GradientPanel(new BorderLayout());
frame.getContentPane().add(grandientPanel);
frame.setVisible(true);
}
}
基本图形绘制
常见的图形绘制方法:
- 绘制直线:drawLine()
- 绘制矩形:drawRect()
- 绘制椭圆:drawOval()
- 绘制弧形:drawArc()
- 绘制多边形:drawPolygon()
示例:
@ Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.drawLine(0, //起点横坐标
this.getHeight, //起点纵坐标
this.getWidth, //终点横坐标
this.getHeight/2);//终点纵坐标
}
常见的图形填充方法:
- 填充矩形:fillRect()
- 填充椭圆:fillOval()
- 填充扇形:fillArc()
- 填充多边形:fillPolygon()
示例:
@ Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillArc(this.getWeight/2-100, //圆心横坐标
this.getHeight/2-100,//圆心纵坐标
200, 200, //圆的直径
0, 360);//起始弧度,终止弧度
}
使用Swing的GUI编程的更多相关文章
- Java中的Swing及AWT又称GUI编程
Java中的Swing及AWT又称GUI编程. 关于学习Java要不要学Swing及AWT,这个完全取决于个人的开发及发展方向. 如果从事web方向的开发,则可以不用学习Swing及AWT. 如果从事 ...
- Java GUI编程中AWT/swing/SWT的优缺点
http://www.cnblogs.com/dugang/archive/2010/10/22/1858478.html AWT AWT是Abstract Window Toolkit(抽象窗口工具 ...
- Java学习之Swing Gui编程
Java学习之Swing Gui编程 0x00 前言 前面的使用的Gui是基于Awt 去进行实现,但是在现实写Gui中 AWT实际运用会比较少. 0x01 Swing 概述 AWT 和Swing 区别 ...
- 1.JAVA之GUI编程概述
下列内容为本人看毕向东老师java视频教程学习笔记! JAVA GUI图形用户界面编程: Windows 操作系统提供两种操作方式: ...
- 4.JAVA之GUI编程事件监听机制
事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...
- java Gui编程 事件监听机制
1. GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式: 1. 命令交互方式 图书管理系统 ...
- python大法好——ython GUI编程(Tkinter)
Python GUI编程(Tkinter) Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的 ...
- 实验十五 GUI编程练习与应用程序部署
实验十五 GUI编程练习与应用程序部署 实验时间 2018-12-6 一:理论部分 1.Java 程序的打包:编译完成后,程序员将.class 文件压缩打包为 .jar 文件后,GUI 界面序就可以 ...
- Python GUI 编程
Python GUI编程(Tkinter) Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的 ...
随机推荐
- 离散数学3.1&&3.3
离散数学 当前所使用的数字电脑是离散的,二进制指令,传输到内存 早先使用的模拟电脑是连续的 判断是否是命题(两个步骤)[不要跳步骤] 陈述句 要么是真命题要么是假命题 真假性 真:用T或1表示,假:用 ...
- STL 较详尽总结
STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些" ...
- [BUUCTF]REVERSE——[GWCTF 2019]xxor
[GWCTF 2019]xxor 附件 步骤: 无壳,64位ida载入 程序很简单,首先让我们输入一个字符串,然后进行中间部分的操作,最后需要满足44行的if判断,看一下sub_400770函数 得到 ...
- ASP.NET WebApi 依赖 SAP Connector dll 报错
说明 本地 VS 开发 ASP.NET WebApi 调试运行没有问题,但发布到服务器 IIS 上就报错.结果发现是 SAP 依赖库的问题:sapnco.dll.sapnco_utils.dll. 错 ...
- 联盛德 HLK-W806 (十): 在 CDK IDE开发环境中使用WM-SDK-W806
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- 「Python实用秘技03」导出项目的极简环境依赖
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第3期 ...
- 深度解析HashMap
讲讲HashMap? 源码解析 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { //辅助 ...
- MAMP的使用
MAMP下载并安装 下载地址:https://pan.baidu.com/s/1TgoKBG3F59NGO8lEj9mf4Q 密码:2m3d 安装:按照提示,一直下一步直到完成 MAMP操作
- 【LeetCode】270. Closest Binary Search Tree Value 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetco ...
- 【LeetCode】765. Couples Holding Hands 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/couples- ...