《Java GUI》
目录
一、窗体类
JFrame为Java GUI中的顶层容器,又称之为窗体类,我们可以继承它并定义自己的窗体类。
界面布局类型
- 边界布局(了解)
- 流式布局(了解)
- 网格布局(了解)
- 自定义布局(较灵活,较常用)
案例一(注册窗体实现)
package com.hpr.page;
import javax.swing.*;
public class Register extends JFrame {
public Register() {
//设置标题
setTitle("注册界面");
//设置大小
setSize(400, 600);
//设置居中
setLocationRelativeTo(null);
//设置可变性
setResizable(false);
//设置关闭选项
setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置布局类型
setLayout(null);
//设置窗体可见性
setVisible(true);
}
public static void main(String[] args) {
new Register();
}
}
执行结果
窗体解析(其中title会占掉≈33像素高度)
二、组件
常用组件
- JLabel:标签
- JTextField:文本框
- JPasswordField:密码框
- JButton:按钮
- JTextArea:文本域
- JTable jt:表格
- JScrollPane:滚动条
- …
界面UI设计
案例二(UI还原实现)
package com.hpr.page;
import javax.swing.*;
import java.awt.*;
public class Register extends JFrame {
JLabel jlb1, jlb2, jlb3, jlb4, jlb5;
JTextField jtf;
JPasswordField jpf1, jpf2;
JTextArea jta;
JScrollPane jsp;
JButton jbtn;
public Register() {
//相关设置
...
//1.欢迎注册
jlb1 = new JLabel("欢迎注册", JLabel.CENTER);
jlb1.setFont(new Font("楷体", Font.BOLD, 34));
jlb1.setBounds(0, 0, 400, 80);
//2.昵称
jlb2 = new JLabel("昵称", JLabel.RIGHT);
jlb2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
jlb2.setBounds(20, 120, 80, 30);
jtf = new JTextField();
jtf.setBounds(120, 120, 250, 30);
//3.密码
jlb3 = new JLabel("密码", JLabel.RIGHT);
jlb3.setFont(new Font("微软雅黑", Font.PLAIN, 18));
jlb3.setBounds(20, 180, 80, 30);
jpf1 = new JPasswordField();
jpf1.setBounds(120, 180, 250, 30);
//4.确认密码
jlb4 = new JLabel("确认密码", JLabel.RIGHT);
jlb4.setFont(new Font("微软雅黑", Font.PLAIN, 18));
jlb4.setBounds(20, 240, 80, 30);
jpf2 = new JPasswordField();
jpf2.setBounds(120, 240, 250, 30);
//5.个人简介
jlb5 = new JLabel("个人简介", JLabel.RIGHT);
jlb5.setFont(new Font("微软雅黑", Font.PLAIN, 18));
jlb5.setBounds(20, 300, 80, 30);
jta = new JTextArea();
jsp = new JScrollPane(jta);
jsp.setBounds(120, 300, 250, 80);
//6.注册按钮
jbtn = new JButton("注册");
jbtn.setBackground(new Color(70, 247, 76));
jbtn.setBounds(120, 410, 250, 30);
//窗体添加组件
this.add(jlb1);
add(jlb2);
add(jtf);
add(jlb3);
add(jpf1);
add(jlb4);
add(jpf2);
add(jlb5);
add(jsp);
add(jbtn);
//窗体可见性设置放在最后一句
setVisible(true);
}
public static void main(String[] args) {
new Register();
}
}
执行结果
三、事件监听
相关概念
- 事件源:事件发起的源头;
- 监听器:实现监听接口的类为监听类,该类的对象为监听器;
- 事件处理:监听到事件信号后要做的事。
案例三(事件监听)
- EventTest类
package com.hpr.page;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class EventTest extends JFrame {
JButton jbtn1, jbtn2, jbtn3;
public EventTest() {
setTitle("事件测试");
setSize(300, 500);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null);
//创建监听器
CustomListener cl = new CustomListener();
//1.信息提示框
jbtn1 = new JButton("登录");
jbtn1.setBounds(20, 100, 260, 30);
jbtn1.addActionListener(cl);
//2.确认提示框
jbtn2 = new JButton("退出");
jbtn2.setBounds(20, 200, 260, 30);
jbtn2.addActionListener(cl);
//3.文本提示框
jbtn3 = new JButton("卸载");
jbtn3.setBounds(20, 300, 260, 30);
jbtn3.addActionListener(cl);
add(jbtn1);
add(jbtn2);
add(jbtn3);
setVisible(true);
}
/**
* 自定义监听类
*/
class CustomListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//事件处理
if (e.getSource() == jbtn1) {
JOptionPane.showMessageDialog(null, "登录成功!");
} else if (e.getSource() == jbtn2) {
int ope = JOptionPane.showConfirmDialog(null, "确认退吗?");
System.out.println("选择:" + ope); //0,1,2
} else if (e.getActionCommand().equals("卸载")) {
String ly = JOptionPane.showInputDialog(null, "请告诉我们理由以便后续改进");
System.out.println("理由:" + ly);
}
}
}
public static void main(String[] args) {
new EventTest();
}
}
执行结果
四、面板类
Jpanel是轻量级组件,属中间容器,JFrame若是一块黑板,JPanel就是贴纸或海报。
案例四(Jpanel测试)
- src目录下创建resources包(文件夹),并在该包下添加两张图片(img01.jpg,img02.jpg)
- 创建ImgUtil类
package com.hpr.util;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImgUtil extends JPanel {
//图片路径
private String imgPath;
public ImgUtil(String imgPath) {
this.imgPath = imgPath;
}
@Override
public void paint(Graphics g) {
try {
//读取图片(文件操作)
BufferedImage image = ImageIO.read(new File(imgPath));
//绘制图片
g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
/*
*g.drawLine():绘制线段
*g.drawArc():画圆
*g.fillArc():填充圆
*g.drawRect():画矩形
*g.fillRect():填充矩形
*g.drawString():绘制字符串
**/
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 创建JPanelTest类
package com.hpr.page;
import com.hpr.util.ImgUtil;
import javax.swing.*;
import java.awt.*;
public class JPanelTest extends JFrame {
JPanel jp1, jp2, jp3;
public JPanelTest() {
setTitle("JPanel测试");
setSize(600, 400);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null);
jp1 = new JPanel();
jp1.setBackground(Color.green);
jp1.setBounds(100, 30, 400, 60);
jp2 = new ImgUtil("./src/resources/img01.jpg");
jp2.setBounds(20, 120, 260, 200);
jp3 = new ImgUtil("./src/resources/img02.jpg");
jp3.setBounds(310, 120, 260, 200);
add(jp1);
add(jp2);
add(jp3);
setVisible(true);
}
public static void main(String[] args) {
new JPanelTest();
}
}
执行结果
总结
重点
- JavaGUI容器、组件、事件;
- 监听器;
- 封装、继承、多态的综合应用。
难点
- 事件监听处理;
- 自定义布局的坐标系。