java基础(7)

1.GUI与CUI

GUI概述:全称为Graphical User Interface(图形用户接口),用图形的方式,来显示计算机操作的界面,这样更方便更直观

CLI概述:Command line User Interface(命令行用户接口),就是常见的Dos命令行操作,需要记忆一些常用的命令,操作不直观

2. awt和wing包

既然我们知道了GUI,而我们的java也提供了造图形界面的编程,而实现图形界面靠的是两个包,java.awt包和javax.swing包

java.awt:Abstract Window TooLKit(抽象窗口工具包),需要调用本地系统方法实现功能,属于重量级控件

javax.swing:在AWTd的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由java实现,增强了移植性,属于轻量级控件

3.GUI继承体系图

GUI继承体系图

4.如何造GUI窗体

概述:想要学习怎么造一个窗体,我们可以通过一个个案例来学习,因为造窗体需要学习的类很多,如一个按钮,一个文本框等,都是一个个的类,还有它们的方法,如果想全部学完,那需要花费很多的时间,所以我们通过案例来简单学习如何造GUI窗体

使用Frame类创建一个简单窗体

  • public Frame():构造方法,带参构造则会创建一个带有Title的窗体
  • setTitle:设置Title
  • setSize:设置窗体大小
  • setLocation:设置窗体位置
  • setVisible:设置窗体可见
  • setResizable(boolean b):设置窗体是否可调大小
  • dispose:释放由此window及其子组件拥有的所有组件所使用的所有本机屏幕资源,继承自他父亲Window类

注意:这里建的是一个不可见的窗体,需要通过setVisible方法设置窗体可见,而且通过点击生成的窗体的“X”,是无法退出窗体的,那么怎么关闭窗体呢?我们通过事件监听机制关闭(后面会讲)

代码示例(创建一个窗体):

import java.awt.Frame;

public class FrameDemo {
	public static void main(String[] args) {
		//创建一个Frame对象
		Frame f = new Frame();
		//设置GUI界面标题
		f.setTitle("javaGUI界面");
		//设置大小
		f.setSize(400, 300);
		/*与上面设置大小代码等价
		 * Dimension d = new Dimension(400, 300);
		 * f.setSize(d);
		*/
		//设置位置
		f.setLocation(400, 200);
		/*
		 * 与上面设置位置大小代码等价
		 * Point p = new Point(400, 200);
		f.setLocation(p);
		 */
		//设置位置和大小
		//f.setBounds(400, 200, 400, 300);
		//设置是否可见
		f.setVisible(true);
	}
}

事件监听机制

事件监听机制包括四个部分

  • 事件源:事件发生的地方
  • 事件:就是要发生的事情
  • 事件处理:就是针对发生的事情做出的处理方案
  • 事件监听:就是把事件源和事件关联起来

通过事件监听机制关闭窗体案例:

import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class FrameDemo {
	public static void main(String[] args) {
		//创建一个Frame对象
		Frame f = new Frame();
		
		//设置GUI界面标题
		f.setTitle("javaGUI界面");
		
		//设置大小
		f.setSize(400, 300);
		
		//设置位置
		f.setLocation(400, 200);
		
		//设置窗体可见
		f.setVisible(true);
		f.addWindowListener(new WindowListener() {
			
			@Override
			public void windowOpened(WindowEvent e) {
				
			}
			
			@Override
			public void windowIconified(WindowEvent e) {
				
			}
			
			@Override
			public void windowDeiconified(WindowEvent e) {
				
			}
			
			@Override
			public void windowDeactivated(WindowEvent e) {
				
			}
			//用户视图从窗口的系统菜单中关闭窗口时调用
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
			@Override
			public void windowClosed(WindowEvent e) {
				
			}
			
			@Override
			public void windowActivated(WindowEvent e) {
				
			}
		});
	}
}

思考:上面的案例中的WindowListener是一个接口,当我们实现这个接口的时候,就必须重写它的所有方法,但我们只使用了一个方法,其他方法显得很多余,那有什么方法可以只使用一个方法么?

答案是有的,我们通过适配器类来达到这样的效果,这个适配器类就是WindowAdapter

关闭窗口案例(适配器类实现):

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class FrameDemo2 {
	public static void main(String[] args) {
		//创建一个Frame对象
				Frame f = new Frame();
				
				//设置GUI界面标题
				f.setTitle("javaGUI界面");
				
				//设置大小
				f.setSize(400, 300);
				
				//设置位置
				f.setLocation(400, 200);
				
				//设置窗体可见
				f.setVisible(true);
				
				//添加监听机制
				f.addWindowListener(new WindowAdapter() {
					//适配器类实现
					@Override
					public void windowClosing(WindowEvent e) {
						System.exit(0);
					}
				});
	}
}

窗体添加按钮并对按钮设置事件案例

步骤:

  • 创建窗体对象
  • 创建按钮对象
  • 把按钮添加到窗体
  • 窗体显示

代码实现如下:

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class FrameDemo2 {
	public static void main(String[] args) {
		//创建一个Frame对象
				Frame f = new Frame("有按钮的窗体");
				
				f.setBounds(400, 200, 400, 300);
				//设置窗体可见
				f.setVisible(true);
				/*设置窗体布局位流式布局,不设置的话默认是边界布局,
				那么只有一个按钮的情况下就会占据整个窗体*/
				f.setLayout(new FlowLayout());
				//创建按钮对象
				Button b = new Button("我是按钮");
				b.setSize(200, 100);
				//把按钮对象添加到窗体中
				f.add(b);
				
				//给窗体添加监听事件
				f.addWindowListener(new WindowAdapter() {
					//适配器类
					@Override
					public void windowClosing(WindowEvent e) {
						System.exit(0);
					}
				});
				//给按钮添加监听事件
				b.addActionListener(new ActionListener() {
					
					@Override
					public void actionPerformed(ActionEvent e) {
						System.out.println("恭喜你,点了我");
					}
				});
	}
}

知识点补充:常用的五个窗体布局(是实现了LayoutManager接口的不同具体类):

  • 流式布局
  • 边界布局
  • 网格布局
  • 网格包布局
  • 卡片布局

把文本框的值转移到文本域案例

代码实现如下:

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class FrameDemo3 {
	public static void main(String[] args) {
		Frame f = new Frame("转移文本");
		//设置为流式布局
		f.setLayout(new FlowLayout());
		f.setBounds(400, 200, 400, 300);
		//创建组件
		Button b = new Button("数据转移");
		TextField tf = new TextField(20);
		TextArea ta = new TextArea(10, 30);
		//把组件添加到窗体里
		f.add(tf);
		f.add(b);
		f.add(ta);
		
		//给按钮添加监听事件
		b.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				//获取文本域数据
				String tfStr = tf.getText().trim();
				//设置文本域数据
				//ta.setText(tfStr);//会重写设置文本域值,而不是追加
				ta.append(tfStr + "\r\n");
				tf.setText("");
				tf.requestFocus();
			}
		});
		//窗体监听关闭
		f.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		f.setVisible(true);
	}
}

通过鼠标移动到按钮上更改背景色案例(鼠标事件)

代码实现:

import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class FrameDemo4 {
	public static void main(String[] args) {
		Frame f = new Frame("更改背景色");
		f.setLayout(new FlowLayout());
		f.setBounds(400, 200, 400, 300);
		//创建三个有不同功能的按钮
		Button redButton = new Button("红色");
		Button greenButton = new Button("绿色");
		Button blueButton = new Button("蓝色");
		//添加这三个按钮
		f.add(redButton);
		f.add(greenButton);
		f.add(blueButton);
		//为这三个按钮添加鼠标事件
		redButton.addMouseListener(new MouseAdapter() {
			@Override
			//鼠标移入
			public void mouseEntered(MouseEvent e) {
				f.setBackground(Color.red);
			}
		});
		redButton.addMouseListener(new MouseAdapter() {
			@Override
			//鼠标移出
			public void mouseExited(MouseEvent e) {
				f.setBackground(Color.white);
			}
		});
		
		blueButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseEntered(MouseEvent e) {
				f.setBackground(Color.blue);
			}
		});
		blueButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseExited(MouseEvent e) {
				f.setBackground(Color.white);
			}
		});
		
		greenButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseEntered(MouseEvent e) {
				f.setBackground(Color.green);
			}
		});
		greenButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseExited(MouseEvent e) {
				f.setBackground(Color.white);
			}
		});
		//监听窗口关闭
		f.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		f.setVisible(true);
	}
}

控制文本框内只能输入数字字符(键盘录入事件)

代码实现:

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class FrameDemo5 {
	public static void main(String[] args) {
		Frame f = new Frame("文本框只能录入数字");
		f.setLayout(new FlowLayout());
		f.setBounds(400, 200, 400, 300);
		Label l = new Label("请输入你的手机号码,你只能按数字,不信你试试");
		TextField tf = new TextField(40);
		
		f.add(l);
		f.add(tf);
		
		tf.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				//获取从键盘录入的每一个字符
				char ch = e.getKeyChar();
				if(!(ch >= '0' && ch <= '9')){
					//提示框
					JOptionPane.showMessageDialog(f, "请输入数字");
					//使用此事件,以便不会按照默认方式由产生此事件的源代码来处理此事件
					e.consume();
				}
			}
		});
		//监听窗口关闭
				f.addWindowListener(new WindowAdapter() {
					@Override
					public void windowClosing(WindowEvent e) {
						System.exit(0);
					}
				});
				f.setVisible(true);
	}
}

二级菜单

代码实现如下(二级会了,一级,多级菜单应该都会了吧):

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;

public class FrameDemo6 {
	public static void main(String[] args) {
		Frame f = new Frame("二级菜单");
		f.setLayout(new FlowLayout());
		f.setBounds(400, 200, 400, 300);
		//创建菜单栏
		MenuBar mb = new MenuBar();
		//创建菜单
		Menu m = new Menu("菜单");
		Menu m1 = new Menu("系统功能");
		//创建菜单项
		MenuItem mi1 = new MenuItem("打开记事本");
		MenuItem mi2 = new MenuItem("打开dos界面");
		MenuItem mi3= new MenuItem("打开画图工具");
		MenuItem mi4= new MenuItem("退出系统");
		//添加菜单项到菜单
		m1.add(mi1);
		m1.add(mi2);
		m1.add(mi3);
		m.add(m1);
		m.add(mi4);
		//添加菜单到菜单栏
		mb.add(m);
		//添加菜单栏到窗体
		f.setMenuBar(mb);
		mi1.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				Runtime r = Runtime.getRuntime();
				try {
					r.exec("notepad");
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		mi2.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				Runtime r = Runtime.getRuntime();
				try {
					r.exec("cmd");
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		mi3.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				Runtime r = Runtime.getRuntime();
				try {
					r.exec("mspaint");
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		
		mi4.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		//监听窗口关闭
		f.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		f.setVisible(true);
	}
}

设置窗体图标并设置窗体居中

示例代码(工具包Toolkit的使用):

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class FrameDemo7 {
	public static void main(String[] args) {
		Frame f = new Frame("修改窗体图标");
		f.setLayout(new FlowLayout());
		f.setSize(400, 300);
		
		//获取默认工具包
		Toolkit tk = Toolkit.getDefaultToolkit();
		
		//根据路径获取地址
		Image i = tk.getImage("src\\cn\\luyi\\demo1\\1.png");
		
		//给窗体设置图片
		f.setIconImage(i);
		
		//获取屏幕宽高
		Dimension d = tk.getScreenSize();
		double screenWidth = d.getWidth();
		double screenHeight = d.getHeight();
		
		//获取窗体的宽高
		int frameWidth = f.getWidth();
		int frameHeight = f.getHeight();
		
		//获取新的宽高作为坐标值,就是使得窗体居中的坐标了
		int width = (int)(screenWidth - frameWidth) / 2;
		int height= (int)(screenHeight - frameHeight) / 2;
		f.setLocation(width, height);
		
		//监听窗口关闭
				f.addWindowListener(new WindowAdapter() {
					@Override
					public void windowClosing(WindowEvent e) {
						System.exit(0);
					}
				});
				f.setVisible(true);
	}
}
posted @ 2020-07-30 22:31  luyi001  阅读(189)  评论(0编辑  收藏  举报