GUI

JAVA 基础GUI

一、基本概念

1)GUI:图形用户界面

Graphical User Interface(图形用户接口)。

用图形的方式,来显示计算机操作的界面,这样更方便更直观。

2)CLI:

Command line User Interface(命令行用户接口)。

就是常见的 Dos 命令操作。

需要记忆一些常用的命令,操作不直观。

举例:比如创建文件夹,或者删除文件夹等操作。

3)Awt 与 Swing

Java 为 GUI 提供的对象都存在 java.Awt 和 javax.Swing 两个包中。

|--Awt 与 Swing

|--java.Awt:Abctract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属于重量级控件。

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

|-->Component:组件

|--|-->Container:容器

|--|-->Window:窗口

|--|--|-->Frame:框架

|--|--|-->Dialog:对话框

|--|--|--|-->FileDialog:文件对话框

|--|-->Panel:面板容器

|--|-->Button:按钮

|--|-->Label:标签

|--|-->CheckBox:复选框

|--|-->TextComponent:文本组件

|--|--|-->TextArea:文本

|--|--|-->TextField:文本框

重点:Container不同于其它组件,作为一个组件,还可以往里面添加其它组件。通过 add 的方法实现。

Component的继承关系图例:

 

二、布局管理器:

1、容器中的组件的排放方式,就是布局。

2、常见的布局管理器:

|--FlowLayout(流式布局管理器)

|--|--从左到右的顺序排列。

|--|--Panel 默认的布局方式。

|--BorderLayout(边界布局管理器)

|--|--东西南北中

|--|--Frame 默认的布局管理器

|--GridLayout(网格布局管理器)

|--|--规则的矩阵

|--CardLayout(卡片布局管理器)

|--|--选项卡

|--GridBagLayout(网格包布局管理器)

|--|--非规则的矩阵

3、事件监听机制:

事件源(组件)就是 awt 包或者 swing 包中的那些图形界面组件

事件(Event)每一个事件源都有自己特有的对应事件和共性事件。

监听器(Listener)将可以触发某一个事件的动作(不止一个动作),都已经封装到了监听器中。

以上三者,在java 中都已经定义好了,直接获取其对象来用就可以了那么,我们要做的事情就是对产生的动作进行处理。就是事件处理(引发事件后的处理方式)

4、创建图形化界面的基本步骤

1)创建 Frame 窗体。

2)对窗体进行基本设置比如:大小,位置,布局。

3)定义组件

4)将组件通过窗体的 add 方法添加到窗体中

5窗体显示,通过 setVisible(true)显示

5、AwtDemoCode:

package study.part2.day017.guistudy;
import java.awt.*;
import java.awt.event.*;
public class AwtDemoAction {
	public static void main(String[] args) {
		FrameDemo fd = new FrameDemo();
	}
}
class FrameDemo{
	//定义该图形中所需要的组件的引用
	private Frame f;
	private Button btn;
	private TextField tf;
	FrameDemo(){
		init();
	}
	public void init(){
		f = new Frame("my frame");
		//对frame 进行基本设置
		f.setBounds(100, 100, 400, 250);
		f.setLayout(new FlowLayout());
		btn = new Button("my btn");
		tf = new TextField(30);
		//将组件添加到组件中,组件的添加顺序觉得了排列顺序
		f.add(btn);
		f.add(tf);
		//显示窗体
		myEvent();
		//f.addWindowListener(new WindowAdapter());
		f.setVisible(true);
	}
	//单独的事件添加方法
	private void myEvent(){
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		//让按钮具备退出程序的功能
		/**
		 * 按钮就是事件源,
		 * 那么选择哪个监听器呢?
		 * 通过关闭窗体示例,来了解到想要知道,哪个组件具备什么样的特有监听器。
		 * 需要查看该组件对象的功能。
		 * addActionLintener
		 * 用匿名内部类的方法实现。
		 */
		btn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("这是按钮干的。");
				//System.exit(0);
			}
		});
		/**
		 * 移动到鼠标时的事件
		 */
		btn.addMouseListener(new MouseAdapter(){
			private int count =1;
			private int clickCount = 1;
			public void mouseEntered(MouseEvent e){
				System.out.println("鼠标进入"+count++);
			}
			public void mouseClicked(MouseEvent e){
				//因为api中没有提供双击事件,所有要自己设置,通过判断获取的点击次数来实现
				if(e.getClickCount()==2){
					System.out.println("双击了。"+clickCount++);
				}
				//System.out.println("click"+clickCount++);
			}
		});
		//给 btn 添加键盘监听
		btn.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent ke){
				/**
				//27是 ESC 键的值,可以直接==27就能退出,也可以用
				if(ke.getKeyCode()==KeyEvent.VK_ESCAPE){
					System.exit(0);
				}
									//比如输入:a			  对应的编码值:65
				System.out.println(ke.getKeyChar()+"..."+ke.getKeyCode());
				//--------------------------------------------------------
				System.out.println(ke.getKeyText(ke.getKeyCode())+"..."+ke.getKeyChar());
				*/
				//ctrl+enter 的方法
				if(ke.isControlDown()&&ke.getKeyCode()==KeyEvent.VK_ENTER){
					System.out.println("同时按下ctrl和回车键");
				}
			}
		});
		//文本框监听:限制输入的内容为0-9
		tf.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				int code  = e.getKeyCode();
				if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9)){
					System.out.println(code+"--是非法的。程序退出。");
					//禁止输入,屏蔽键盘
					e.consume();
					//System.exit(0);
				}
			}
		});
	}
}

运行结果:

 

6、菜单栏的使用示例

Code:

package study.part2.day017.guistudy;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
public class MyWindowDemoTest {
	public static void main(String[] args) {
		MyWindowDemo mwd = new MyWindowDemo();
	}
}
class MyWindowDemo extends Frame{
	private static final long serialVersionUID = 1L;
	private Frame f;			//框架
	private Button btn;			//按钮
	private Button okBtn;		//确认按钮
	private TextField tf;		//文本输入框
	private TextArea ta;		//文本域
	private Dialog d;			//对话框
	private Label lab;			//文本
	MyWindowDemo(){
		init();
	}
	private void init(){
		f = new Frame("My");
		f.setBounds(100, 100, 500, 400);
		f.setLayout(new FlowLayout());
		tf = new TextField(20);
		btn = new Button("存入");
		ta = new TextArea(14,30);
		//对话框的初始化和添加内容
		d = new Dialog(f,"提示信息!",false);
		d.setBounds(200, 200, 300, 200);
		d.setLayout(new FlowLayout());
		lab = new Label();
		okBtn = new Button("OK。");
		d.add(lab);
		d.add(okBtn);
		f.add(tf);
		f.add(btn);
		f.add(ta);
		myEvent();
		f.setVisible(true);
		
	}
	//单独的事件添加方法
	public void myEvent(){
		//给窗体添加监听器,使用匿名内部类实现
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.out.println("退出。");
				System.exit(0);
			}
		});
		//添加鼠标动作
		btn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				showDir();
				/**
				//初始化一个字符串对象,存入地址信息
				String dirPath = tf.getText();
				//把获取的地址信息传递给 File 
				File dir = new File(dirPath);
				//判断初始化的 File 是否是文件目录,是否存在
				if(dir.exists() && dir.isDirectory()){
					//定义一个字符串数组,接收该文件目录里面的文件列表
					String[] names = dir.list();
					//使用高级 for 循环遍历字符串数组
					for(String name : names){
						System.out.println("文件名是:"+name);
						//把遍历后的文件名存入 TextArea 中,结果发现,只是把文件目录中
						//的最后一个文件写入了,这种方法是适合写入一次数据
						//ta.setText("文件名是:"+name);
						//append() 方法的使用就类式与 StringBuilder的 append 用法
						ta.append("文件名:"+name+"\r\n");
					}
					//清空输入框
					tf.setText("");
				}
				//否则,弹出对话框
				else{
					//把错误信息加载到对话框中
					String info = "【"+tf.getText()+"】"+"输入有误,请重新输入。";
					lab.setText(info);
					d.setVisible(true);
				}
				*/
				/**
				//获取输入的文本
				String text = tf.getText();
				//把输入的文本添加到 TextArea 中
				ta.setText(text);
				//清空 TextField
				tf.setText("");
				System.out.println("输入内容:"+text);
				*/
			}
		});
		//添加鼠标监听器
		btn.addMouseListener(new MouseAdapter(){
			private int clickCount = 1;
			//鼠标单击和双击
			public void mouseClicked(MouseEvent e){
				if(e.getClickCount()==2){
					System.out.println("触发双击事件。");
				}else{
					System.out.println("单击了"+(clickCount++)+"次");
				}
			}
		});
		//添加 Dialog 对话框的事件
		d.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				d.setVisible(false);
			}
		});
		okBtn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				d.setVisible(false);
			}
		});
		//给 TextField 添加键盘点击事件
		tf.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				//如果键盘点击了 enter 键
				if(e.getKeyCode()==KeyEvent.VK_ENTER)
					showDir();
			}
		});
	}
	private void showDir(){
		//初始化一个字符串对象,存入地址信息
		String dirPath = tf.getText();
		//把获取的地址信息传递给 File 
		File dir = new File(dirPath);
		//判断初始化的 File 是否是文件目录,是否存在
		if(dir.exists() && dir.isDirectory()){
			//先情况ta
			ta.setText("");
			//定义一个字符串数组,接收该文件目录里面的文件列表
			String[] names = dir.list();
			//使用高级 for 循环遍历字符串数组
			for(String name : names){
				System.out.println("文件名是:"+name);
				//把遍历后的文件名存入 TextArea 中,结果发现,只是把文件目录中
				//的最后一个文件写入了,这种方法是适合写入一次数据
				//ta.setText("文件名是:"+name);
				//append() 方法的使用就类式与 StringBuilder的 append 用法
				ta.append("文件名:"+name+"\r\n");
			}
			//清空输入框
			tf.setText("");
		}
		//否则,弹出对话框
		else{
			//把错误信息加载到对话框中
			String info = "【"+tf.getText()+"】"+"输入有误,请重新输入。";
			lab.setText(info);
			d.setVisible(true);
		}
	}
}

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值