黑马程序员_Java_GUI

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、GUI概述
1、 GUI:Graphical User Interface(图形用户接口)。
用图形的方式,来显示计算机的操作图形界面。方便、直观。
CLI:Command line User Interface(命令行用户接口)
就是DOS 命令行操作不直观。
2
Java 为GUI 提供的对象,都存在java.Awt 和javax.Swing 两个包中。
Awt 与Swing:
java.Awt : (Abstract Window Toolkit,抽象窗口工具集),需要调用本地系统方法实现功能。属重量级控件。跨平台性较弱。
javax.Swing :在AWT 基础上,建立一套图形界面系统,其中提供了更多组件,而且完全由Java 实现。增强了可移植性,属轻量级控件。
开发时,制作图形化界面时,一般需要导入两个包:import java.awt.*; 和import java.awt.event.*;
3、 GUI继承关系图:

二、布局管理器
1、布局:容器中组件的排放方式。
2
常见的布局管理器:
FlowLayout(流式布局管理器):从左到右的顺序排列。Panel 默认的布局管理器。
BorderLayout(边界布局管理器):东南西北中。Frame 默认的布局管理器。
GridLayout(网络布局管理器):规则的矩阵。
GardLayout(卡片布局管理器):选项卡。
GridBagLayout(网格包布局管理器):非规矩的矩阵。

三、Component
1、 Component 是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互。
2
常用子类:Window、Panel(面板,不能单独存在)
Window 常用子类:Frame、Dialog
Frame 类:是带有标题和边框的顶层窗口。若显示窗体,必须设置setVisible 显示。设置Frame 时,有一个默认的管理器是边界式布局(BorderLayout)。
3、 方法
add() //添加组件(含参数)
setVisible(Boolean b) //根据参数的值来显示或隐藏组件
setSize() //设置窗体大小,参数为窗口的横坐标和纵坐标
setLocation() //设置窗体在本地位置,参数为横、纵坐标
setLayout() //设置布局管理器(参数可以是相应布局管理器的对象)
setBounds() //移动组件并调整其大小,参数是4 个坐标(左边距、右边距、宽、高)
addMouseListener() //添加指定的鼠标监听器
addKeyListener() //添加键盘监听事件
4、 创建图形化界面的步骤:
1)创建frame 窗体。
2)对窗体进行基本设置。比如大小,位置,布局。
3)定义组件。
4)将组件通过窗体的add 方法添加到窗体中。
5)让窗体显示,通过setVisible(true)
代码示例:
package demo.awt;

import java.awt.*;
import java.awt.event.*;

public class FrameDemo {
	
	private Frame f;
	private Button but;
	FrameDemo(){
		init();
	}
	
	public void init(){
		f=new Frame("my frame");
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());
		f.setVisible(true);
	}

	public static void main(String[] args) {
		new FrameDemo();
	}
	
}

四、事件监听机制
1、 事件监听机制组成:事件源、事件(Event)、监听器(Listener)、事件处理(引发事件后处理方式)

  (1)事件源(组件):awt或swing包中的那些图形界面组件

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

        (3)监听器(Listener):将可触发某一事件的动作(不只一个动作),都封装到侦听器中。

        (4)事件处理:引发事件后的处理方式。

2、 事件监听机制流程图

3、 使用说明

组成的前三个在java中都已将定义好了,直接获取其对象来用即可,我们需要做的就是对产生的动作进行处理。

步骤:

        (1)确定事件源(容器或组件)。通过事件源对象的addXXXListener()方法将监听器注册到该事件源上。该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。

        (2)一般用匿名内部类来表示。在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。

代码示例:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class AwtDemo {

	public static void main(String[] args) {
		
		Frame f=new Frame("my awt");
		f.setSize(500, 100);
		f.setLocation(300, 200);
		f.setLayout(new FlowLayout());
		Button b=new Button("我是一个按钮");
		f.add(b);
		f.addWindowListener(new MyWin());
		f.setVisible(true);
	}

}

class MyWin extends WindowAdapter{
	public void windowClosing(WindowEvent e) {
		System.exit(0);
	}
}


五、Window(窗体)

1、 监听:addWindowListener():添加窗口事件监听器

2、 WindowListener接口,复写方法,实例化对象,才能使用。但它有一个已复写全部方法的子类WindowAdapter。

3、WindowAdapter:接收窗口事件的抽象适配器类。此类中的方法为空。它是一个没有抽象方法的抽象类,目的是不能创建对象。此类存在的意思是方便创建监听器对象。使用:因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。并覆盖了其中的所有方法,那么只要继承WindowAdapter,覆盖需要的方法即可。

方法:

windowActivated():激活窗口时调用。

windowClosed():当窗口已被关闭时调用。

windowClosing():窗口正处在关闭过程中时调用。

windowDeactivated():后置窗口时调用。

windowDeiconified():取消图标化窗口时调用。

windowGainedFocus():该 Window 被设置为聚焦 Window 时调用,聚焦 Window 意味着该 Window 或其某个子组件将接收键盘事件。

windowIconified():窗口最小化时调用。

windowLostFocus():该 Window 不再为聚焦 Window 时调用,不再为聚焦 Window 意味着键盘事件不再传递到该 Window 或其任意子组件。

windowOpened():打开窗口时调用。

windowStateChanged():窗口状态改变时调用。

代码示例:

package demo.awt;

import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class MyWindowDemo {
	
	private Frame f;
	private TextField tf;
	private Button bt;
	private TextArea ta;
	
	private Dialog d;
	private Label lab;
	private Button okbt;
	
	MyWindowDemo(){
		init();
	}
	
	public void init(){
		f=new Frame("my window");
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());
		
		tf=new TextField(60);
		bt=new Button("转到");
		ta=new TextArea(25,70);
		
		d=new Dialog(f, "提示信息-self",true);
		lab=new Label();
		okbt=new Button("确定");
		
		d.add(lab);
		d.add(okbt);
		d.setBounds(400,200,240,150);
		d.setLayout(new FlowLayout());
		
		
		f.add(tf);
		f.add(bt);
		f.add(ta);
		myEvent();
		f.setVisible(true);
	}
	
	private void myEvent() {
		
		okbt.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				d.setVisible(false);
			}
		});
		d.addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e) {
				d.setVisible(false);
			}
			
		});
		
		bt.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				String path=tf.getText();
				File file=new File(path);
				if(file.exists()&&file.isDirectory()){
					String[] dir=file.list();
				
					for(String s:dir){
						ta.append(s+"\n");
					}
				}
				else{
					String info="找不到"+path;
					lab.setText(info);
					d.setVisible(true);
				}
					
				
			}
		});
		
		f.addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
			
		});
	}

	public static void main(String[] args) {
		new MyWindowDemo();
	}

}

六、Button(按钮)

1、监听:addActionListener()添加指定的动作监听器

2、 ActionListener 接口:用于接收操作事件的监听器接口。是少数没有适配器接口的其中一个。

其中只有一个方法actionPerformed(),作用:发生操作时调用。

3、 代码示例:

okbt.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				d.setVisible(false);
			}
		});

七、鼠标事件和键盘事件

7.1 鼠标事件

1、 MouseListener: 用于接收组件上“感兴趣的”鼠标事件(eg:按下、释放、单击、进入或离开)的监听器接口。有适配器。

2、 方法:

mouseClicked(MouseEvent e) //鼠标单击(按下并释放)
mouseEntered(MouseEvent e) //鼠标进入组件
mouseExited(MouseEvent e) //鼠标离开组件
mousePressed(MouseEvent e) //鼠标按下时
mouseReleased(MouseEvent e) //鼠标释放时

3、 MouseEvent: (适配器)
成员变量:static int mouse_clicked
方法:int getClickCount() //返回鼠标单击次数

7.2 键盘事件

1、 keyListener: 接收键盘事件的监听器接口。有适配器。

2、 方法:

keyPressed(keyEvent e) //按下某个键时调用此方法
keyReleased(keyEvent e) //释放某个键时调用此方法
keyTyped(keyEvent e) //键入某个键时调用此方法

3、 keyEvent: (适配器)

char getkeyChar() //返回与此事件中的键相关联的字符
int getkeyCode() //获取键盘对应的码
static String getKeyText(int keyCode) //通过码获取对应的键盘字符
InputEvent 类中isControlDown() //判断ctrl 键是否被按下
InputEvent 类中consume() //以非默认方式处理事件,屏蔽键

代码示例:

package demo.awt;

import java.awt.*;
import java.awt.event.*;

public class MouseAndKeyEvent {

	private Frame f;
	private Button but;
	MouseAndKeyEvent(){
		init();
	}
	
	public void init(){
		f=new Frame("my frame");
		f.setBounds(300,100,600,500);
		f.setLayout(new FlowLayout());
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
			
		});
		Button b=new Button("按钮");
		f.add(b);
		b.addMouseListener(new MouseAdapter() {

			public void mouseEntered(MouseEvent e) {
				System.out.println("鼠标进入该组件");
			}
			
		});
		b.addKeyListener(new KeyAdapter() {
		
			public void keyPressed(KeyEvent e) {
				if(e.getKeyCode()==e.VK_A)
					System.out.println("yiyang");
			}
			
		});
		f.setVisible(true);
	}

	public static void main(String[] args) {
		new MouseAndKeyEvent();
	}

}


八、MenuBar(菜单栏)

1、 MenuBar 类: 封装绑定到框架的菜单栏的平台概念。为了将该菜单栏与Frame 对象关联,可以调用该框架的setMenuBar 方法。

2、 主要方法:

add() //添加菜单栏

3、 关联类:

MenuItem 类:菜单项

MenuMenuMenuMenu类:菜单条

add() //将指定菜单项或者标签添加到菜单栏。

MenuBar包括Menu,Menu包括MenuItem、Menu(带箭头)。

代码示例:

package demo.awt;

import java.awt.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyMenuDemo {

	private Frame f;
	private MenuBar mb;
	private Menu m;
	private MenuItem closeItem,openItem,saveItem;
	
	MyMenuDemo(){
		init();
	}
	
	private void init() {
		f=new Frame("my window");
		f.setBounds(300,100,500,600);
		f.setLayout(new FlowLayout());
		
		mb=new MenuBar();
		m=new Menu("文件");
		closeItem=new MenuItem("退出");
		openItem=new MenuItem("打开");
		saveItem=new MenuItem("保存");
		m.add(openItem);
		m.add(saveItem);
		m.add(closeItem);
		mb.add(m);
		
		f.setMenuBar(mb);
		myEvent();
		f.setVisible(true);
	}

	private void myEvent() {
		openItem.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				new FileDialog(f,"打开文件",FileDialog.LOAD).setVisible(true);
				
			}
		});
		saveItem.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				new FileDialog(f,"保存文件",FileDialog.SAVE).setVisible(true);
				
			}
		});
		closeItem.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		f.addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
			
		});
	}
	public static void main(String[] args) {
		new MyMenuDemo();
		
	}

}

九、Jar包双击执行

既然是图形化界面,就需要通过图形化界面的形式运行程序,而不是是用Dos命令行执行,那么如何通过双击程序就执行程序呢?这就需要将程序的class文件打包。

步骤如下:

        1、首先要在java文件中导入一个包,没有则需创建一个包,如package mymenu;

        2、生成包:通过编译javac -d c:\myclass MyMenu.java,此时则在c盘下的myclass文件夹下生成了所有的.class文件

        3、在此目录下新建一个文件,如1.txt或者其他任意名称任意扩展名的文件都可,然后在其中编辑固定的格式:“Main-Class: mymenu.MenuDemo”,只写引号中的内容。需要需要在冒号后有一个空格,在文件末尾要回车。

        4、编译:jar -cvfm my.jar 1.txt mymenu即可。如果想添加其他信息,则直接编译jar即可得出相应的命令

        5、此时双击即可执行。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值