一、GUI的概念
GUI(Graphical User Interface)即图形用户界面,它能够使应用程序看上去更加友好(GUI之前都是基于控制台的程序)
二、Swing概述
Swing是纯Java组件,使得应用程序在不同的平台上运行时具有相同外观和相同的行为
大部分组件类位于javax.swing包中
三、容器组件
概述
组件是Java的图形用户界面的基本组成部分
组件以图形化的方式显示在屏幕上并能与用户进行交互
组件不能独立地显示出来,必须放在一定的容器(container)中
容器可以容纳多个组件,通过调用add()方法向容器中添加组件
常用容器
窗口Frame
窗口(Frame)和面板(Panel)是最常用的两个容器
JFrame类的构造方法
JFrame() | 创建新窗体,该窗体初始为不可见 |
---|---|
JFrame(String title) | 创建新窗体,使用参数title指定标题,该窗体初始为不可见 |
框架(JFrame) 内部包含一个名叫Container(内容面板)的面板容器,要给框架中添加图形控件,通常将它们加入到这个内容面板中
也可以创建Jpanel面板对象,把JPanel作为一个组件添加到某个容器中
面板Jpanel
JPanel提供面板,它是轻量级的容器
面板中可以添加其它组件,也可以设置布局
构 造 方 法
JPanel() | 创建一个空面板 |
---|---|
JPanel(LayoutManaer layout) | 创建带有指定布局的面板 |
import javax.swing.*;
import java.awt.*;
public class DemoFrame1 extends JFrame {
/*
提供一个构造方法,设置创建出的窗口的基本属性特征
*/
public DemoFrame1() throws HeadlessException {
this.setTitle("我的GUI窗口");//标题
this.setSize(300, 300);//大小
//this.setLocation(200, 300);//设置距x,y轴距离
this.setLocationRelativeTo(null);//设置组件的相对位置,为null,默认水平,垂直居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭选项
this.setResizable(false);//禁止调整窗口大小
//创建一个面板组件
JPanel jPanel = new JPanel();
jPanel.setBackground(Color.blue);
//jPanel.setBackground(new Color(71, 179, 71));//设置背景颜色
this.add(jPanel);
//创建一个按钮组件
JButton jButton = new JButton("登录");
jPanel.add(jButton);//把按钮组件添加到面板上
this.setVisible(true);//显示窗口, 放在最后
}
}
四、布局管理器
概述
swing中,提供了布局管理器类的对象可以管理
每个Jpanel都有一个布局管理器对象,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器,调用Jpanel的setLayout方法改变其布局管理器对象或通过构造方法设置
在布局管理上采用容器和布局管理相分离的方案
常用的布局管理器简单演示
FlowLayout流式布局 ,
import javax.swing.*;
import java.awt.*;
public class DemoFrame2 extends JFrame {
/*
提供一个构造方法,设置创建出的窗口的基本属性特征
*/
public DemoFrame2() throws HeadlessException {
this.setTitle("我的GUI窗口");//标题
this.setSize(300, 300);//大小
//this.setLocation(200, 300);//设置距x,y轴距离
this.setLocationRelativeTo(null);//设置组件的相对位置,为null,默认水平,垂直居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭选项
this.setResizable(false);//禁止调整窗口大小
/*
//创建一个面板组件
JPanel jPanel = new JPanel();
//jPanel.setBackground(Color.blue);
//jPanel.setBackground(new Color(71, 179, 71));//设置背景颜色
this.add(jPanel);
*/
/*
JPanel 面板组件 可以添加其他功能组件
面板组件默认情况下是流式布局
流式布局
*/
//JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
//设置向左对齐
//JPanel jPanel = new JPanel();
//jPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.LEFT,20,10));
//设置面板布局管理器 为流式布局 组件对齐方式 水平,垂直间距
this.add(jPanel);
//创建一个按钮组件
JButton jButton1 = new JButton("登录1");
JButton jButton2 = new JButton("登录2");
jPanel.add(jButton1);//把按钮组件添加到面板上
jPanel.add(jButton2);
this.setVisible(true);//显示窗口, 放在最后
}
}
BorderLayout边界布局,
import javax.swing.*;
import java.awt.*;
public class DemoFrame3 extends JFrame {
public DemoFrame3() throws HeadlessException {
this.setTitle("我的GUI窗口");//标题
this.setSize(300, 300);//大小
//this.setLocation(200, 300);//设置距x,y轴距离
this.setLocationRelativeTo(null);//设置组件的相对位置,为null,默认水平,垂直居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭选项
this.setResizable(false);//禁止调整窗口大小
/*
边界布局: 总共有5个区域,上,下,左,右,中间
中间是必须的
其他的区域都是可选的
5个区域中可以放置其他的组件,放入组件后,自动填充与该区域大小一致
*/
JPanel jPanel = new JPanel(new BorderLayout());
this.add(jPanel);//把面板添加到窗口上
JButton jButton1 = new JButton("登录1");
JButton jButton2 = new JButton("登录2");
JButton jButton3 = new JButton("登录3");
JButton jButton4 = new JButton("登录4");
JButton jButton5 = new JButton("登录5");
jPanel.add(jButton1,BorderLayout.NORTH);
jPanel.add(jButton2,BorderLayout.SOUTH);
jPanel.add(jButton3,BorderLayout.WEST);
jPanel.add(jButton4,BorderLayout.EAST);
jPanel.add(jButton5);//默认添加到中间的区域
this.setVisible(true);//显示窗口, 放在最后
}
}
GridLayout网格布局
import javax.swing.*;
import java.awt.*;
public class DemoFrame4 extends JFrame {
public DemoFrame4() throws HeadlessException {
this.setTitle("我的GUI窗口");//标题
this.setSize(300, 300);//大小
//this.setLocation(200, 300);//设置距x,y轴距离
this.setLocationRelativeTo(null);//设置组件的相对位置,为null,默认水平,垂直居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭选项
this.setResizable(false);//禁止调整窗口大小
/*
网格布局: 类似于表格,可以指定行数和列数
依次向里面添加组件 从左至右
*/
JPanel jPanel = new JPanel(new GridLayout(2,2));
this.add(jPanel);//把面板添加到窗口上
JButton jButton1 = new JButton("登录1");
JButton jButton2 = new JButton("登录2");
JButton jButton3 = new JButton("登录3");
JButton jButton4 = new JButton("登录4");
JButton jButton5 = new JButton("登录5");
jPanel.add(jButton1);
jPanel.add(jButton2);
jPanel.add(jButton3);
jPanel.add(jButton4);
jPanel.add(jButton5);//默认添加到中间的区域
this.setVisible(true);//显示窗口, 放在最后
}
}
五、常用组件
按钮(JButton)
构造方法:
JButton(String text) 创建一个带文本的标签
JButton(Icon image) 创建一个带图像的标签
jButton.setBackground(Color blue);设置按钮的背景色
jButton.setToolTipText("点击登录");//组件上的悬停提示
jButton.setEnabled(false);//禁用组件
标签(JLabel)
标签是容纳文本和图标的控件,通常用来在界面中标识别的控件
构造函数:
JLabel() 创建一个空的标签
JLabel(String text) 创建一个带文本的标签
JLabel(Icon image) 创建一个带图像的标签
JLabel jLabel = new JLabel("欢迎登录");
jLabel.setForeground(Color.CYAN);//字体颜色
jLabel.setFont(new Font("楷体", Font.BOLD, 20));//设置字体
单行文本(JTextField)
//单行文本输入框
JTextField accountField = new JTextField(15);
// 默认显示 宽度15列
JTextField accountField = new JTextField("你好",15);
System.out.println(accountField.getText());
//拿到这个输入
密码框(JPasswordField)
JPasswordField p = new JPasswordField(15);
// 宽度15列
多行文本框(JTextArea)
//创建多行文本框
JTextArea jTextArea = new JTextArea(10,20);
jTextArea.setLineWrap(true);//自动换行
//jTextArea.setEditable(false);//设置不可编辑
JScrollPane jsp = new JScrollPane(jTextArea);
//创建滚动面板
jPanel.add(jsp);//把滚动面板添加到面板上
菜单栏组件
JPanel jPanel = new JPanel();
JMenuBar jMenuBar = new JMenuBar();//菜单栏
JMenu jMenu1 = new JMenu("文件");//创建菜单
JMenu jMenu2 = new JMenu("编辑");
JMenu jMenu3 = new JMenu("帮助");
jMenuBar.add(jMenu1);//把菜单添加到菜单栏
jMenuBar.add(jMenu2);
jMenuBar.add(jMenu3);
JMenuItem ji1 = new JMenuItem("新建");
JMenuItem ji2 = new JMenuItem("保存");
JMenuItem ji3 = new JMenuItem("打开");
JMenuItem ji4 = new JMenuItem("关于");
jMenu1.add(ji1);
jMenu1.add(ji2);
jMenu1.add(ji3);
jMenu3.add(ji4);
this.add(jPanel);
this.setJMenuBar(jMenuBar);//把菜单栏添加到窗口
六、事件处理
事件
用户与GUI组件进行交互就会发生事件,如:按下一个按钮、用键盘输入一个字符、点击鼠标等等;
事件监听
一个源(事件源)产生一个事件(事件对象)并把它送到监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接受,监听器将处理这些事件;
一个事件源必须注册监听器以便监听器可以接受关于一个特定事件的通知
事件处理
添加事件监听器(此处即为匿名类)
loginButton.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标点击");
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("鼠标按下");
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标释放");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("鼠标悬停");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("鼠标移出");
}
});
accountField.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println(e.getKeyCode());
System.out.println(e.getKeyChar());
}
});
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("点击登录按钮");
String account = accountField.getText();
String password = new String(passwordField.getPassword());
System.out.println(account);
System.out.println(password);
if(account.length()==0){
System.out.println("请输入账号");
}
}
});
七、对话框
JOptionPane对话框
showMessageDialog():消息对话框
主要有五种消息类型,类型不同,图标不同:
ERROR_MESSAGE 错误消息提示
INFORMATION_MESSAGE 信息提示
WARNING_MESSAGE 警告提示
QUESTION_MESSAGE 问题提示
PLAIN_MESSAGE 简洁提示
showConfirmDialog():确认对话框
主要有四种消息类型,类型不同,图标不同:
DEFAULT_OPTION 默认选项
YES_NO_OPTION 是/否选项
YES_NO_CANCEL_OPTION 是/否/取消选项
OK_CANCEL_OPTION 确定/取消
八、内部类
什么是内部类
定义在一个类的内部的类就被称为内部类或嵌套类,这个类外部的类就称为外部类或者宿主类
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立 的.class文件
是外部类的一个成员,可以自由地访问外部类的成员变量
内部类的分类
成员内部类
成员内部类——就是位于外部类成员位置的类
可以使用外部类中所有的成员变量和成员方法(包括private的)
使用private修饰内部类,这样我们就无法通过创建对象的方法来访问
class Outer{
class Bird implements Fly{
public void fly(){
System.out.println("鸟会飞");
}
}
}
静态内部类
被 static 所修饰,属于成员内部类
不能使用外部类的非static成员变量和成员方法
class Outer{
int a;
static class Inner{
System.out.println(a);
}
}
局部内部类
定义在一个方法或者一个作用域里面的类
只能在自身所在方法和属性中被使用
class Outer{
int a;
public void test(){
class Inner{
public void t(){
System.out.println(a);
}
}
}
}
匿名内部类
一个没有名字的类,是内部类的简化写法
class Outer{
int a;
public void test(){
new Bird();//创建一个内部类对象
// 有事此对象只用一次,为进一步简化代码,创建一个匿名内部类
//匿名内部类
new Fly() {
@Override
public void fly() {
System.out.println("鸟会飞");
}
};
}
}
内部类的意义
封装性
对这个类的使用访问者的访问权限做出一定的限制,我们需要将一些我们不愿意让别人看到的操作隐藏起来.
实现多继承
java中不支持一个类继承多个类
在内部类中就可以完美的实现多继承
class Father{
int F = 10;
}
class Mother{
int M = 10;
}
class Son{
class Son_1 extends Father{
}
class Son_2 extends Mother{
}
int father = new Son_1().F;
int mother = new Son_2().M;
System.out.println(father+mother);
}