Java 高级部分

java 高级部分

文章目录

  • java 高级部分
    • 一 Java GUI 入门
      • 1.基础概念
      • 2.窗口开发
      • 3.基本界面
      • 4.Swing 高级组件
      • 5.Swing 图形绘制
    • 二 Java 常用类
      • 1.Object
      • 2.包装类
      • 3.String 类
      • 4.StringBuffer 与 StringBuilder
      • 5.Math 类
    • 三 Java 集合

一 Java GUI 入门

1.基础概念

  1. GUI ( graphics user interface ):图形界面用户接口,Java 用来做界面的一套 API ( application program interface )
  2. 程序界面有两种
    • 控制台程序:console()
      System.out.println();
      
    • 窗口界面
      Java 高级部分_第1张图片

2.窗口开发

  1. 容器
    Java 高级部分_第2张图片
  2. 基本组件
    Java 高级部分_第3张图片

3.基本界面

  1. 做一个窗口
    • 编写一个类,找准一个父类 JFrame
    • 编写一个构造方法,设置一些属性
      public class Wnd1 extends JFrame{
      	JLabel lblAccount = new JLabel("账号:");
      	JTextField jtfAccount = new JTextField(25);
      	JLabel lblPwd = new JLabel("密码:");
      	JPasswordField jtfPwd = new JPasswordField(25);
      	JButton btnLogin = new JButton("登录");
      	JButton btnCalcel = new JButton("取消");
      	/*
      	JButton jb1 = new JButton("东");
      	JButton jb2 = new JButton("南");
      	JButton jb3 = new JButton("西");
      	JButton jb4 = new JButton("北");
      	JButton jb5 = new JButton("中");*/
      	JPanel jp1 = new JPanel();
      	JPanel jp2 = new JPanel();
      	JPanel jp4 = new JPanel();
      	JPanel jp3 = new JPanel();
      	
      	public Wnd1(){
      		//设置窗口的一些特性:
      		//1、设置大小
      		this.setSize(400,300);
      		
      	 	//2、设置标题
      		this.setTitle("QQ登录");
      		
      	 	//3、设置可见
      	 	this.setVisible(true);
      	 	
      		//4、设置可以被关闭
      		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      		
      	 	//5、设置窗口的位置,相对桌面居中
      	 	this.setLocationRelativeTo(null);
      	 	
      		//6、设置不能改变大小
      		this.setResizable(false);
      		
      		//放入我们的组件
      		initComponent();
      	}
      	
      	/**
      	 *初始化各个组件
      	 */
      	 public void initComponent(){
      		jp1.add(lblAccount);
      		jp1.add(jtfAccount);
      		jp2.add(lblPwd);
      		jp2.add(jtfPwd);
      		jp4.add(btnLogin);
      		jp4.add(btnCalcel);
      		jp3.add(jp1);
      		jp3.add(jp2);
      		jp3.add(jp4);
      		
      		// 将jp3放在窗口的中间.
      		this.add(jp3, "Center");
      		
      		// 事件处理者
      		MyHandler myHandler = new MyHandler();
      		// 将事件源和事件处理者关联
      		btnLogin.addActionListener(myHandler);
      		
      		// 将组件放入窗口受布局的影响,我们JFrame的默认布局是边框布局。
      		/*this.add(jb5,"Center");
      		this.add(jb1, "East");
      		this.add(jb2, "South");
      		this.add(jb3,"West");
      		this.add(jb4,"North");*/
      	}
      	
      	/**
      	 *事件处理者
      	 *ActionListener:按钮的点击事件接口
      	*/
      	class MyHandler implements ActionListener {
      		@Override
      		public void actionPerformed(ActionEvent e) {
          		// 获取账号,密码信息
          		String account = Wnd1.this.jtfAccount.getText();
          		String pwd = jtfPwd.getText();
          		
          		if("admin".equals(account) && "123".equals(pwd)){
              		System.out.println("登录成功!");
              		Wnd2 wnd2 = new Wnd2();
              		// 释放窗口
              		dispose();
          		}else{
              		System.out.println("账号或密码错误!");
              		
              		// null:表示是这个消息框的父窗口
              		JOptionPane.showMessageDialog(Wnd1.this,"账号或密码错误!");
          		}
      		}
      	}
      	
      	public static void main(String[] args) {
      		new Wnd1();
      	}
      }
      
      public class Wnd2 extends JFrame{
      	public Wnd2(){
      		this.setSize(800,400);
      		this.setVisible(true);
      	}
      }
      
  2. 开发组件
    Java 高级部分_第4张图片
    • 登录界面开发
      Java 高级部分_第5张图片
    • 组件布局
      • 边框布局 BorderLayout
        Java 高级部分_第6张图片
      • 流水布局 FlowLayout,从左往右,从上往下的布局
        JPanel:默认是流水布局的
        Java 高级部分_第7张图片
  3. 事件处理
    • 点击按钮,需要有所反应
  4. 观察者模式
    • 事件源:发生事件的对象
    • 事件处理者:实现了 ActionListener 接口的类的对象
    • 事件源.addActionListener(事件处理者)

4.Swing 高级组件

  1. 表格组件
    • JTable
  2. 构造方法
    Java 高级部分_第8张图片
    /**
     * 构造一个指定行和列的空表格
     */
    JTable(int,int)
    
    /**
     * 第一个参数为 Object 类型的二维数组,第一维表示行,第二维表示
     * 每行的具体数据
     * 第二个参数为 Object 类型的一维数组,表示每列的列表名
     */
    JTable(Object[][],Object[])
    
    /**
     * 使用模型来构造表格,TableModel 是一个接口,我们可以
     * 自己写一个类实现这个接口,从而完成模型的功能
     * 
     * Java 也帮我们提供了一个默认的表模型,DefaultTableModel
     * DefaultTableModel mdl=new DefaultTableModel(vRows,vColums);
     * JTable myTable=new JTable(mdl);
     */
    JTable(TableModel model)
    
  3. 新增行
    void addRow(Object[] rowData)	// 在模型的末尾添加一行
    void addRow(Vector rowData)		// 在模型的末尾添加一行
    
  4. 删除行
    void removeRow(int row)		// 从模型中删除 row 的行
    
  5. 代码
    public class JTableDemo1 extends JFrame{
    	JTable myTable;
    	
    	public JTableDemo1(){
    		this.setSize(500,400);
        	this.setTitle("我的数据表");
        	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        	this.setLocationRelativeTo(null);
        	initComponent();
        	this.setVisible(true);
    	}
    	
    	public void initComponent(){
        	Object[] columns = {
                	"编号",
                	"姓名",
                	"性别",
                	"职位"
        	};
        	Object[][] rowData = {
                	{1,"张飞","男","打手"},
                	{2,"关羽","男","打手"},
                	{3,"孔明","男","军事"},
                	{4,"小乔","女","小三"},
        	};
        	
        	// 将表格放入窗口中
        	myTable = new JTable(rowData, columns);
        	// 设置单元格的高
        	myTable.setRowHeight(30);
        	// 将表格放入一个滚动界面中
        	this.add(new JScrollPane(myTable));
    	}
    	
    	public static void main(String[] args){
    		new JTableDemo1();
    	}
    }
    
    public class JTableDemo2 extends JFrame{
    	JTable myTable;
    	
    	public JTableDemo2(){
        	this.setSize(500,400);
        	this.setTitle("我的数据表");
        	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        	this.setLocationRelativeTo(null);
        	initComponent();
        	this.setVisible(true);
    	}
    	
    	public void initComponent(){
        	// 表示是列名称
        	Vector vColumns = new Vector();
        	vColumns.add("编号");
        	vColumns.add("姓名");
        	vColumns.add("性别");
        	vColumns.add("职位");
        	
        	//表示行的数据
        	Vector vRows = new Vector();
        	Vector v1 = new Vector();
        	v1.add(1);
        	v1.add("张飞");
        	v1.add("男");
        	v1.add("打手");
        	vRows.add(v1);
        	Vector v2 = new Vector();
        	v2.add(2);
        	v2.add("张飞");
        	v2.add("男");
        	v2.add("打手");
        	vRows.add(v2);
        	Vector v3 = new Vector();
        	v3.add(3);
        	v3.add("张飞");
        	v3.add("男");
        	v3.add("打手");
        	vRows.add(v3);
        	Vector v4 = new Vector();
        	v4.add(4);
        	v4.add("张飞");
        	v4.add("男");
        	v4.add("打手");
        	vRows.add(v4);
        	
        	// 不加入这个模型的话,后续进行增删改有问题
        	DefaultTableModel mdl = new DefaultTableModel(vRows, vColumns);
        	// 将表格放入窗口中
        	myTable = new JTable(mdl);
        	// 设置单元格的高
        	myTable.setRowHeight(30);
        	// 将表格放入一个滚动界面中
        	this.add(new JScrollPane(myTable));
    	}
    	
    	public static void main(String[] args) {
        	new JTableDemo2();
    	}
    }
    
    public class JTableDemo3 extends JFrame{
    	JTable myTable;
    	JButton btnAdd = new JButton("新增");
    	JButton btnDel = new JButton("删除");
    	JPanel pnl = new JPanel();
    	private DefaultTableModel mdl;
    	
    	public JTableDemo3(){
        	this.setSize(500,400);
        	this.setTitle("我的数据表");
        	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        	this.setLocationRelativeTo(null);
        	initComponent();
        	this.setVisible(true);
    	}
    	
    	public void initComponent(){
        	pnl.add(btnAdd);
        	pnl.add(btnDel);
        	this.add(pnl,"South");
        	
        	btnAdd.addActionListener(new ActionListener() {
            	@Override
            	public void actionPerformed(ActionEvent e) {
                	AddEmpFrame addEmpFrame = new AddEmpFrame(mdl);
            	}
        	});
        	btnDel.addActionListener(new ActionListener() {
            	@Override
            	public void actionPerformed(ActionEvent e) {
            		// 点击是:0,否:1,取消:2,×:-1
                	int i = JOptionPane.showConfirmDialog(null, "确认删除吗?");
                	if(i==0){
                    	// 获取表格的选中的行
                    	int selectedRow = myTable.getSelectedRow();
                    	if(selectedRow==-1){
                        	JOptionPane.showMessageDialog(null,"没有选中任何行!");
                        	return;
                    	}
                    	mdl.removeRow(selectedRow);
                	}
            	}
        	});
    
        	//表示是列名称
        	Vector vColumns = new Vector();
        	vColumns.add("编号");
        	vColumns.add("姓名");
        	vColumns.add("性别");
        	vColumns.add("职位");
        	
        	//表示行的数据
        	Vector vRows = new Vector();
        	Vector v1 = new Vector();
        	v1.add(1);
        	v1.add("张飞");
        	v1.add("男");
        	v1.add("打手");
        	vRows.add(v1);
        	Vector v2 = new Vector();
        	v2.add(2);
        	v2.add("张飞");
        	v2.add("男");
        	v2.add("打手");
        	vRows.add(v2);
        	Vector v3 = new Vector();
        	v3.add(3);
        	v3.add("张飞");
        	v3.add("男");
        	v3.add("打手");
        	vRows.add(v3);
        	Vector v4 = new Vector();
        	v4.add(4);
        	v4.add("张飞");
        	v4.add("男");
        	v4.add("打手");
        	vRows.add(v4);
        	
        	// 不加入这个模型的话,后续进行增删改有问题
        	mdl = new DefaultTableModel(vRows, vColumns);
        	// 将表格放入窗口中
        	myTable = new JTable(mdl);
        	// 设置单元格的高
        	myTable.setRowHeight(30);
        	// 将表格放入一个滚动界面中
        	this.add(new JScrollPane(myTable));
    	}
    	
    	public static void main(String[] args) {
        	new JTableDemo3();
    	}
    }
    
    class AddEmpFrame extends JFrame{
    	DefaultTableModel mdl;
    	JLabel lbl1 = new JLabel("编号:");
    	JLabel lbl2 = new JLabel("姓名:");
    	JLabel lbl3 = new JLabel("性别:");
    	JLabel lbl4 = new JLabel("职业:");
    	JTextField jtf1 = new JTextField(25);
    	JTextField jtf2 = new JTextField(25);
    	JTextField jtf3 = new JTextField(25);
    	JTextField jtf4 = new JTextField(25);
    	JButton btnSave = new JButton("保存");
    	JButton btnClose = new JButton("关闭");
    	JPanel pn1 = new JPanel();
    	JPanel pn2 = new JPanel();
    	JPanel pn3 = new JPanel();
    	JPanel pn4 = new JPanel();
    	JPanel pn5 = new JPanel();
    	JPanel pn6 = new JPanel();
    	
    	public  AddEmpFrame(DefaultTableModel mdl){
        	this.mdl = mdl;
        	this.setSize(400,500);
        	this.setTitle("新增员工");
        	this.initComponent();
        	this.setResizable(false);
        	this.setLocationRelativeTo(null);
        	this.setVisible(true);
    	}
    	
    	public void initComponent(){
        	pn1.add(lbl1);
        	pn1.add(jtf1);
        	pn2.add(lbl2);
        	pn2.add(jtf2);
        	pn3.add(lbl3);
        	pn3.add(jtf3);
        	pn4.add(lbl4);
        	pn4.add(jtf4);
        	pn5.add(btnSave);
        	pn5.add(btnClose);
        	pn6.add(pn1);
        	pn6.add(pn2);
        	pn6.add(pn3);
        	pn6.add(pn4);
        	pn6.add(pn5);
        	this.add(pn6);
        	
        	btnSave.addActionListener(new ActionListener() {
            	@Override
            	public void actionPerformed(ActionEvent e) {
                	Vector v = new Vector();
                	v.add(jtf1.getText());
                	v.add(jtf2.getText());
                	v.add(jtf3.getText());
                	v.add(jtf4.getText());
                	mdl.addRow(v);
            	}
        	});
        	btnClose.addActionListener(new ActionListener() {
            	@Override
            	public void actionPerformed(ActionEvent e) {
                	dispose();
            	}
        	});
    	}
    }
    

5.Swing 图形绘制

  1. 核心对象 Graphics
    • Graphics:当成一只笔
      • public abstract class Graphics extends Object{ // 代码体 }
      • Graphics 类是所有图形上下文的抽象基类,允许应用程序可以在组件(已知在各种设备上实现),以及闭屏图像上,进行绘制
      • Graphics 对象封装了 Java 支持的基本呈现操作所需的状态信息
    • 对象的获取
      • Graphics g=this.getGraphics();
      • 利用这个对象可以在窗口中,按钮上进行绘图
  2. 重绘
    • 当窗口发生改变以后,窗口会被重绘,只会重绘自己的一些窗口特征,而我们自己绘制的内容没有被重绘的,我们需要重写 paint() 方法,在这个方法中重绘
      @OVerride
      public void paint(Graphics g){
      	super.paint(g);
      	
      	// 绘制你自己的图形
      	for(int i=0;i<lines.size(){
      		Line line=(Line) lines.get(i);
      		g.drawLine(line.x1,line.y1,line.x2,line.y2);
      	}
      }
      
  3. 绘图操作
    /**
     * Toolkit:工具包
     * Toolkit.getDefaultToolkit():获取默认工具包
     */
    Image img=Toolkit.getDefaultToolkit().getImage("pName.png");
    

二 Java 常用类

资料
JAVA_API_CN.exe
JavaAPI 学习(java.lang).pdf
java笔记.txt

1.Object

2.包装类

资料
基本数据类型、包装类型和 String 间的转换

Java 高级部分_第9张图片

  1. 包装类
    • 对于基本数据类型的封装,封装称为了对象,方便操作
  2. 字符串 --> 基本数据类型、包装类
    • Integer 包装类的 public static int parseInt(String s):可以将由“数字”字符组成的字符串转换为整型
    • 类似地,使用 java.lang 包中的 Byte、Short、Long、Float、Double 类调用相应的类方法可以将由“数字”字符组成的字符串,转化为相应的基本数据类型
  3. 基本数据类型、包装类 --> 字符串
    • 调用 String 类的 public static String valueOf(int a n) 可将 int 型转换为字符串
    • 相应的 valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(double d)、valueOf(boolean b) 可由参数的相应类型到字符串的转换
  4. 字符数组 --> 字符串
    • String 类的构造器:String(char[] c) 和 String(char[] c,int offset,int length) 分别用字符数组中的全部字符和部分字符创建字符串对象
  5. 字符串 --> 字符数组
    • public char[] toCharArray():将字符串中的全部字符存放在一个字符数组中的方法
    • public void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):提供了将指定索引范围内的字符串存放到数组中的方法
  6. 字节数组 --> 字符串
    • String(byte[] b):通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的字符串
    • String(byte[] b,int offset,int length):用指定的字节数组的一部分,即从数组起始位置 offset 开始取 length 个字节构造一个字符串对象
  7. 字符串 --> 字节数组
    • public byte[] getBytes():使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
    • public byte[] getBytes(String charsetName):使用指定的字符集将此 String 编码到byte 序列,并将结果存储到新的 byte 数组

3.String 类

  1. 字符串的本质是字符数组,具有不可变性

  2. 字符串的构造

    • String(byte[] bytes):构造一个新的 String,方法是使用平台的默认字符集解码字节的指定数组
    • String(byte[] bytes,String charsetName):构造一个新的 String,方法是使用指定的字符集解码指定的字节数组
    • 适合于在各种编码中进行转换
  3. String 的常用 API

    方法原型 说明
    boolean equalsIgnoreCase(String anotherString) 判断字符串 anotherString 是否与当前字符串相等,忽略大小写模式
    int compareTo(String anotherString 根据 ASCII 码比较字符串 anotherString 和当前字符串的大小,比较方式类似于 c 语言中的 strcmp 函数
    boolean startsWith(String prefix) 判断当前字符串是否以字符串 prefix 为开头
    boolean endsWith(String suffix) 判断当前字符串是否以字符串 suffix 为后缀
    int indexOf(int ch) 搜索字符 ch 在当前字符串中第一次出现的索引,没有出现则返回 -1
    int indexOf(String str) 搜索字符串 str 在当前字符串中第一次出现的索引,没有出现则返回 -1
    int lastIndexOf(int ch) 搜索字符 ch 在当前字符串中最后一次出现的索引,没有出现则返回 -1
    int lastIndexOf(String str) 搜索字符串 str 在当前字符串中最后一次出现的索引,没有出现则返回 -1
    char cahrAt(int index) 用于从指定位置提取单个字符,该位置由 index 指定,索引值必须为非负数
    String substring(in index) 用于提取从 index 指定的位置开始的字符串部分
    String substring(int begin,int end) 用于提取 begin 和 end 位置之间的字符串部分
    String concat(String str) 用于连接两个字符串,并新建一个包含调用字符串的字符串对象
    String replace(char oldChar,char newChar) 用于将调用字符串中出现的 oldChar 指定的字符全部替换为 newChar 指定的字符
    replaceAll(String regex,String replacement) 用于将调用字符串中出现或者匹配 regex 的字符串全部都替换为 replacement 指定的字符
    String trim() 用于返回一个前后不含任何空格的调用字符串的副本
  4. 正则表达式(用于验证指定字符串是否合法的一个模板)

    // s:你要验证的字符串,表达式:(匹配公式)
    boolean bFlag=s.matches(表达式);
    
    • 单个字符

      标识符 说明
      某个单词(例如:1) 直接匹配
      . 匹配任意的字符
      [0-9] 数组1-9,在里面时
      ^表达式 必须以表达式的规则为开头
      表达式$ 必须以表达式的规则为结尾
    • 字符个数

      标识符 次数
      * 0次或者多次
      + 1次或者多次
      0次或者1次
      {n} 恰好 n 次
      {n, } n 次到无限
      {n,m} 从 n 次到 m 次
    • 快捷符号

      标识符 说明
      \d 表示 [0-9]
      \D 表示 [^ 0-9]
      \w 表示 [0-9A-Z_a-z]
      \W 表示[^0-9A-Z_a-z]
      \s 表示 [\t \n \r]
      \S 表示 [^ \t \n \r \f]
  5. 正则表达式作用

    • 用于验证手机号码、邮箱、生日等
    • 过滤
      • replaceAll()
    • 拆分
      • split()

4.StringBuffer 与 StringBuilder

  1. 可变字符串,当大量的对于字符串做操作,可以使用
  2. 代表可变的字符序列,JDK1.0 中声明,可以对字符串内容进行增删,此时不会产生新的对象
  3. 作为参数传递时,方法内部可以改变值
  4. StringBuffer 类不同于 String ,其对象必须使用构造器生成
    • StringBuffer():初始容量为 16 的字符串缓冲区
    • StringBuffer(int size):构造指定容量的字符串缓冲区
    • StringBuffer(String str):将内容初始化为指定字符串内容
  5. StringBuffer 类的常用方法
    /**
     * 当 append 和 insert 时,如果原来 value 数组长度不够,可扩容
     */
    StringBuffer append(xxx);	// 提供了很多的 append() 方法,用于进行字符串拼接
    StringBuffer insert(int offset,xxx);	// 在指定位置插入 xxx
    StringBuffer delete(int start,int end);	// 删除指定位置的内容
    StringBuffer replace(int start,int end,String str);	// 把 [start,end) 位置替换成 str
    StringBuffer reverse();	// 把当前字符串序列逆转
    
    int indexOf(String str);
    char charAt(int n);
    void setCharAt(int n,char ch);
    int length();
    String substring(int start,int end);
    
  6. StringBuilder 类
    • StringBuilder 和 StringBuffer 非常相似,均代表可变的字符序列,而且提供相关功能的方法也一样
  7. 面试题:对比 String、StringBuffer、StringBuilder
    • String(JDK1.0):不可变字符序列
    • StringBuffer(JDK1.0):可变字符序列、效率低、线程安全
    • StringBuilder(JDK5.0):可变字符序列、效率高、线程不安全
  8. 注意:作为参数传递的话,方法内部 String 不会改变其值,StringBuffer 和 StringBuilder 会改变其值

5.Math 类

  1. 里面都是静态常量和静态方法:用于对数学做一些计算用
  2. 一些常用方法
    public static double ceil(double a){  // 代码体 }
    public static double floor(double a){  // 代码体 }
    public static int round(float a){  // 代码体 }
    public static long round(double a){  // 代码体 }	// -12.5会出现错误
    
    public static double pow(double a,double b){  // 代码体 }
    
  3. Math.round() 四舍五入方法

三 Java 集合

你可能感兴趣的:(后端,java,开发语言,后端,jvm,websocket)