------- 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中组件的继承关系图
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中的组件。
事件:每一个事件源都有自己特有的对应事件和共性事件,可认为是对窗口的操作。
监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
事件监听机制流程图
可以看出我们首先需要将将监听器对象注册到事件源上(通过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)来添加菜单。
菜单继承体系
抽象类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培训、期待与您交流! ----------