黑马程序员 java_GUI

                             

                              ------- android培训java培训、期待与您交流! ----------

 

 

 

 

GUI

 

 

当我们与计算机进行交互有两种方式,GUI和CLI 。

GUI  Graphical User Interface(图形用户接口)。用图形的方式,来显示计算机操作的界面,这样

更方便直观。

CLI   Command line User Interface (命令行用户接口)。就是常见的Dos命令行操作。需要记忆一

些常用的命令,操作不直观。

 

普通用户在计算机上的操作几乎都使用的GUI。 

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

 

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

java.Awt:

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

javax.Swing:

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

这里学习AWT包中的对象。

 

GUI中组件的继承关系图 


黑马程序员 java_GUI_第1张图片

Component表示组件,是这个体系的顶层超类。它下面又分为两支,Container和非Container。

Container为容器,可以加入其它组件,而右边的组件不能加入其它组件。

 

 

 

布局管理器

 

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

常见的布局管理器:

 

FlowLayout(流式布局管理器)

从左到右的顺序排列。

Panel默认的布局管理器。

 

BorderLayout(边界布局管理器)

东,南,西,北,中

Frame默认的布局管理器,并且加入Frame中组件将居中覆盖全部区域,后加入的组件将覆盖先加入的。

 

 

GridLayout(网格布局管理器)

规则的矩阵,如拨号盘。

 

CardLayout(卡片布局管理器)

选项卡。

 

GridBagLayout(网格包布局管理器)

非规则的矩阵,网页上的移动广告标签。

 

 

 

创建图形化界面:

Frame 是带有标题和边框的顶层窗口。它的父类Window 对象是一个没有边界和菜单栏的顶层窗

口。所以要创建一个可见窗口时必须使用Frame对象。

 

步骤

1,创建frame窗体。

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

3,定义组件。

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

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

 

Frame  f = new Frame(“my window”);
f.setLayout(new FlowLayout());//设置布局
f.setSize(500,400);//设置窗体大小
f.setLocation(300,200);//设置窗体出现在屏幕的位置
f.setVisible(true);//使窗口可见

 

创建这个窗口后发现窗口无法关闭,这是因为这个窗口只有界面,而没有添加效果。java提供

了事件监听机制来对组件添加效果,当我们操作某个组件时,就会有相应的效果。

 

 

 

事件监听机制

 

事件监听机制组成

1.事件源(组件)

2.事件(Event)

3.监听器(Listener)

4.事件处理(引发事件后处理方式)

 

事件源:就是awt包或者swing包中的那些图形界面组件,就是上面GUI中的组件。

事件:每一个事件源都有自己特有的对应事件和共性事件,可认为是对窗口的操作。

 

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

 

事件监听机制流程图


黑马程序员 java_GUI_第2张图片
可以看出我们首先需要将将监听器对象注册到事件源上(通过add方法),并且要预先定义好事件的处理方式,这样一旦有事件作用到事件源上,监听器就会将事件包装成对象并传递给事件处理方式,事件处理方式就将采用相应的处理(不同的事件,采用不同的处理)。

 

定义事件处理方式

 

由上图可知要让组件具备某种效果,还需要在事件处理方式中定义。

不同的监听器对应不同的事件源,通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上,方法中接受的是该监听器对象,由于监听器是接口,其中的方法都是抽象的,这就需要我们覆盖这些方法,有的监听器中很多方法(其中有的是我们窗口中用不到的),如果全部覆盖,势必影响效率。

API提供了适配器,实现了相应的监听器接口,复写了监听器中的方法,但是这些方法都为空,调用这些方法时会没有任何效果,也不会抛出异常,这时我们就可以根据需要复写相应的方法。有的监听器中方法较少没有适配器,如ActionListener只有一个方法actionPerformed,所以没有适配器。

 

 

不同的监听器对应不同的事件 

窗体事件

 

由WindowListener监听。监听的操作就是窗体上的事件,包括窗体的关闭,激活,打开等等。应用于Window及其子类。

 

示例

 f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e){
				System.out.println("我关");
				System.exit(0);
			}
			public void windowActivated(WindowEvent e){
				System.out.println("我活了。");
			}
			public void windowOpened(WindowEvent e){
				System.out.println("我被打开了,哈啊哈");
			}
		});

 

 

Action事件

 

有ActionListener监视。监听器中只有一个方法actionPerformed,所以此监视器没有适配器。ActionEvent表示当特定于组件的动作(比如被按下)发生时,由组件(比如 Button)生成此高级别事件。

//but以被定义为一个Button
		but.addActionListener(new ActionListener(){
			 //public void actionPerformed(ActionEvent e)
		    public void actionPerformed(ActionEvent e)
			{
				System.out.println("action ok");
			}
		});

 

 

键盘事件

 

由MouseListener监听。

监视的操作包括按下,释放,及键入某个键的方法,常用按下方法。

在KeyEvent中键盘上的每个键都被定为了常量,还可通过getKeyCode()获取键对应的keyCode,

getKeyChar()返回与此事件中的键关联的字符。例如,shift + "a" 的KEY_TYPED事件(表示键入的值)返回值 "A"。

 

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+"..是非法的");
					//表示不会按照默认的方式由产生此事件的源代码来处理此事件
					//在这里表示字符将不会存入tf中
					e.consume();
				}
			}
		});
		
		but.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				//首先判断ctlr是否被按下,在判断enter键是否被按下
				if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
					System.out.println("ctrl+enter is run");
				
			}
		});

 

 鼠标事件

 

由MouseListener监视,监视的鼠标操作包括,点击,进入某组件,在组件上按下,释放等。

but.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){
				///getClickCount获取鼠标点击次数
				if(e.getClickCount()==2)
					System.out.println("双击动作"+clickCount++);
			}
		});

 

 

 

 

菜单

 

在GUI中菜单是一个比较特殊的对象。Frame对象不能通过add方法将菜单加入到窗体中,而要使用setMenuBar(MenuBar b)来添加菜单。

 

菜单继承体系


黑马程序员 java_GUI_第3张图片

 

抽象类MenuComponent是所有与菜单相关的组件的超类。在这一方面,类 MenuComponent与 AWT 组件的抽象超类Component相似。

MenuBar表示一个菜单平台概念,通过调研Frame的SetMenuBar方法可以将菜单栏与Frame关联。

MenuItem表示菜单项,它的子类Menu表示菜单。

 

在窗体中添加菜单:

 

1.先创建菜单条 MenuBar。

2.再创建菜单 Menu,每一个菜单中建立菜单项 MenItem。

也可以菜单添加到菜单中,作为子菜单,因为Menu是MenuItem的子类。

3.通过setMenuBar()方法,将菜单添加到Frame中。

 

在窗体上加入菜单组件

//定义窗体,及其组件
		f = new Frame("my window");
		f.setBounds(300,100,500,600);
		f.setLayout(new FlowLayout());
		
		//定义菜单组件
		mb = new MenuBar();
		m = new Menu("文件");
		subMenu = new Menu("子菜单");
		subItem = new MenuItem("子条目");
		closeItem = new MenuItem("退出");
		
		//将菜单中添加菜单项或子菜单
		subMenu.add(subItem);
		m.add(subMenu);
		m.add(closeItem);
		//在菜单栏中添加菜单
		mb.add(m);
		//将菜单栏加入到窗体中
		f.setMenuBar(mb);

 

 

在菜单项上注册监听器

//在菜单项上添加监听器
		closeItem.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		});

 

 

 

 

                                              ------- android培训java培训、期待与您交流! ----------

 

你可能感兴趣的:(java)