---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
1、 GUI概述
GUI(GraphicalUser Interface),即图形用户接口。原始的用户接口为命令行用户接口(Command line User Interface,简称CLI),就是常见的Dos命令行操作,但是这样的接口操作不直观,不方便。所以有了GUI,像我们常接触的Window窗口。Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
界面的设计并不重点讲述,这里讲大体知识点稍微进行说明,主要是要多用。重点看后面应用部分。
2、 Awt和Swing
(1) java.Awt:Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能,如我们使用AWT在Java窗口放置以个按钮,那么实际上使用的是一个具有本地外观和感觉的按钮。能够跨平台使用,但是相对Swing还是比较弱的,属于重量级控件,即比较依赖底层系统。
(2) javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由java实现。增强了移植性,属轻量级控件。
3、 组件的继承关系图
Container:为容器,是以个特殊的组件,该组件中可以通过add方法添加其他组件进来。
4、 布局管理器
容器中的组件的排放方式,就是布局。容器中组件位置和大小是由布局管理器来决定的,容器对布局管理器的特定实例保持一个引用。当容器需要定位一个组件时,它将调用布局管理器来完成。
常见的布局管理器:
FlowLayout(流式布局管理器),从左道右的顺序排列。是Panel默认的布局管理器。
BorderLayout(边界布局管理器),按东南西北中的方位放置,是Frame默认的布局管理器。
GridLayout(网格布局管理器),一种规则的矩阵,比如计算器软件的按钮,组件的放置还是比较自由的。
GriBagLayout(网格包布局管理器),非规则的矩阵,有些组件可能占多个网格。
GardLayout(卡片布局管理器),选项卡形式。
如果想复合式地使用多个布局方式, 可以在大框架中加入若干面板(Panel类), 对面板设置想要的布局方式.
5、 事件监听机制
用户对组件的操作,就是一个事件,组件需要监听和处理事件,给用户做出反应。
事件监听机制的组成:
事件(Event):用户对组件的操作。
事件源(即组件):被操作的组件。
监听器(Listener):监听程序。
事件处理:引发事件后的处理方式。
事件监听机制的流程图:
6、 GUI的应用
由示例看如何处理窗口事件,Action事件,鼠标和键盘事件等。
先看运行结果图,其风格随操作系统:
示例代码:
import java.awt.*; import java.awt.event.*; import javax.swing.*; //创建面板 class MyPanel extends JPanel{ JButton btn1 = new JButton("登陆");//创建按钮 JButton btn2 = new JButton("鼠标事件测试"); JLabel labName = new JLabel("用户名"); JTextField txtName = new JTextField(30); JLabel labPass = new JLabel("密 码"); JPasswordField txtPass = newJPasswordField(30); JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); JPanel p3 = new JPanel(); public MyPanel(){ setLayout(new GridLayout(3,2)); p1.add(labName); p1.add(txtName); p2.add(labPass); p2.add(txtPass); p3.add(btn2); p3.add(btn1); add(p1); add(p2); add(p3); } } class FrameDemo{ private JFrame fram; private MyPanel panel = new MyPanel(); FrameDemo(){ init(); } public void init(){ //窗口的基本设置 fram = new JFrame("My Frame"); //窗口位置初始 fram.setBounds(300,200, 400, 200); fram.setLayout(new FlowLayout()); fram.add(panel);//加入面板 myEvent();//事件处理 //窗口关闭也可用直接fram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //显示窗口 fram.setVisible(true); } private void myEvent(){ //窗口添加窗口监听器,以从此窗口接手窗口事件 fram.addWindowListener(new WindowAdapter(){ //复写WindowAdapter类的关闭方法 public void windowClosing(WindowEvent e){ System.exit(0); } }); //按钮事件 panel.btn1.addActionListener(newActionListener(){ public void actionPerformed(ActionEvent e){ //事件处理,用户名和密码输入正确 String str1 = panel.txtName.getText(); String str2 = panel.txtPass.getText(); if(str1.equals("张三") &&str2.equals("123")) { System.out.println("登陆成功!"); } else { System.out.println("用户名或密码错误!"); } } }); //鼠标事件,键盘事件与其类似,查阅相关API即可,不再示例 panel.btn2.addMouseListener(newMouseAdapter(){ public void mouseEntered(MouseEvent e){ System.out.println("鼠标进入按钮"); } public voidmouseClicked(MouseEvent e){ System.out.println("鼠标点击"); } }); } } public classGuiDemo { public static void main(String[] args){ try {//跟随系统风格 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exceptione) { e.printStackTrace(); } new FrameDemo(); } }
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------