(16) - GUI

---------------------- 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培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值