• 第五小节之GUI(图形用户界面)


    GUi:全程是Graphical User Interface,即图形用户界面,就是应用程序提供给用户操作的图形界面,包括窗口、菜单、按钮、工具栏和其它各种图形界面元素。提供了丰富的类,这些类分别位于java.awt和javax.swing包中,简称AWT和Swing

    AWT:用于创建图形用户界面的一个工具包,它提供了一系列用于实现图形界面的组件。分为两大类:component和MenuComponent。其中MenuComponent是所有与菜单相关的组件的父类,Component则是除菜单外其他AWT组件的父类,他表示一个能以图形化方式显示出来,并可与用户交互的对象。

    Component类通常称为组件,根据Component的不同作用,可将其分为基本组件类和容器类。Component类的一个子类Container,表示为一个容器,它是一个特殊的组件,可以用来容纳其他组件。

    显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素的多少。

    图像分辨率则是单位英寸中所包含的像素点数,其定义趋近于分辨率本身的定义。

    矢量图是由计算机的算法产生的,可以无限的放大或缩小,不会有任何损失,通常有矢量软件制作

    位图是由一个一个的小色块组成,放大后会看见那些小色块,同一面积内小色块越多分辨率就越高

    GBK:三原色0~255 254种灰度级

    分辨率:主要是指显示器所能显示的像素的多少,可以从显示分辨率与图像分辨率两个方向分类

    1、window类是不依赖其他容器而独立存在,它有两个子类,分别是Frame类和Dialog类。Frame类用于创建一个具有标题栏的框架窗口,作为程序的主界面。Dialog类用于创建一个对话框,实现与用户的信息交互。

    2、Panel面板 Panel也是一个容器,但是它不能单独存在,只能存在其他容器,一个Panel对象代表了一个长方形的区域,在这个区域中可以容纳其他组件。在程序中通常会使用Panel来实现一些特殊的布局。

    AWT事件处理

      事件处理机制专门相应用户的操作,比如,想要用户的点击鼠标,按下键盘灯操作,就需要使用ATW的事件处理机制。

        事件对象:封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。

        事件源(组件):事件发生的场所,通常就是产生事件的组件。

        监听器(Listener):负责监听事件源上发生的事件,并对各种事件作出相应的处理的对象(对象中包含事件处理器)

        事件处理器:监听器对象对接收的事件对象进行相应处理的方法。

    事件源是一个组件,当用户进行一些操作时,如按下鼠标或释放键盘等,这些动作会触发相应的事件。如果事件源注册了事件监听器,则触发的相应事件将会被处理。

    在程序中,如果想实现事件的监听机制,首相需要定义一个类事件事件监听器的接口。例如:Window类型的窗口需要实现WindowListener。接着通过addWinListener()方法为事件源注册事件监听器对象,当事件源上发生事件时,便会触发事件监听器对象,由事件监听器调用相应的方法来处理相应的事件。

    事件适配器:JDk提供了一些适配器类,它们是监听器接口的默认实现类,这些实现类中实现了接口的所有方法,但方法中没有任何代码。程序可以通过继承适配器类来达到实现监听器接口的目的。几乎所有的监听器接口都有对应的适配器类,同过继承适配器类来实现监听器接口时,需要处理哪种事件,直接重写该事件对应的方法即可。

     1 package event;
     2 
     3 import java.awt.BorderLayout;
     4 import java.awt.Container;
     5 import java.awt.event.KeyEvent;
     6 import java.awt.event.KeyListener;
     7 import java.awt.event.MouseEvent;
     8 import java.awt.event.MouseListener;
     9 import java.awt.event.MouseMotionListener;
    10 import java.awt.event.WindowAdapter;
    11 import java.awt.event.WindowEvent;
    12 import java.awt.event.WindowListener;
    13 
    14 import javax.swing.JFrame;
    15 import javax.swing.JLabel;
    16 import javax.swing.JTextArea;
    17 
    18 public class WindowAdapterFrame extends JFrame {
    19     // 1. 属性
    20 
    21     // 2. 方法
    22     public WindowAdapterFrame() {
    23         this.setTitle("窗口适配器");
    24         setSize(600, 400);
    25         setResizable(false);
    26         setLocationRelativeTo(null);
    27         //setDefaultCloseOperation(EXIT_ON_CLOSE);
    28         
    29         WindowListener listener = new WindowAdapter() {
    30             @Override
    31             public void windowClosing(WindowEvent arg0) {
    32                 dispose();
    33             }
    34         };
    35         
    36         this.addWindowListener(listener);
    37     }
    38 
    39     public static void main(String[] args) {
    40         JFrame frame = new WindowAdapterFrame();
    41         frame.setVisible(true);
    42     }
    43 }

    常用事件分类:窗体事件、鼠标事件、键盘事件、动作事件

    布局管理器:组件不能单独存在,必须放置于容器当中,而组件在容器中的位置和尺寸是由布局管理器来决定的。在Java.awt包中提供了五中布局管理器,分别是FlowLayout(流式布局管理器)、BorderLayout(边界布局管理器)、GridLayout(网格布局管理器)、BorderLayout(边界布局管理器)、GirdLayout(卡片布局管理器)。每个容器在创建时都会使用一种默认的布局管理器,在程序中可以通过容器对象的setLayout()方法设置布局管理器,通过布局管理器来自动进行组件的布局管理。例如把一个Frame窗体的布局管理器设置为FlowLayout,代码如下:

    1 Frame frame=new Frame();
    2 frame.setLayout(new FlowLayout);

      FlowLayout:容器会将组件按照添加顺序从左向右放置、从上到下,当到达容器的边界时,会自动将组件放到下一行的开始位置。这些组件可以左对齐,居中对齐(默认方式)、或右对齐的方式排列

      FlowLayout的构造方法:

        FlowLayout()组件默认居中对齐,水平、垂直间距默认为5个单位

        FlowLayout(int align)指定组件相对于容器的对齐方式,水平、垂直间距默认为5个单位

        FlowLayout(int align,int hgap,int vgap)指定组件的对齐方式和水平、垂直间距

    其中参数align决定组件在每行中相对于容器边界的对齐方式,可以使用该类中提供的常量作为参数传递给构造方法,其中FlowLayout.LEFT用于表示左对齐、FlowLayout.RIGHT用于表示右对齐、FlowLayout.CENTER用于表示居中对齐。参数hgap和参数vgap分别设定组件之间的水平和垂直间隙,可以填入一个任意的数值

    BorderLayout(边界布局管理器)它将容器划分为5个区域,分别是东(EAST)、南(SOUTH)、西(NORTH)、中(CENTER)。组件可以被放置在这五个区域的中任意一个。当向BorderLayout布局管理器的容器中添加组件时,需要使用add(Component comp,Object constraints)方法,其中参数constraints是Object类型,在传参时可以使用BorderLayout类提供的5个常量,它们分别是EAST、SOUTH、WEST和CENTER。如果不指定添加到哪个区域,则默认添加到CENTER区域,并且每个区域只能放置一个组件,如果向一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。

    GridLayout(网格布局管理器)使用纵横线将容器分成n行m列大小相等的网格,每个网格中放置一个组件。添加到容器中的组件首先放置在第一行第一列(左上角)的网格中,然后在第一行的网格中从左向右依次放置其他组件,行满后,继续在下一行中从左向右放置组价。与FlowLayout不同的是,放置在GridLayout布局管理器中的组件将自动占据网格的整个区域。

      GridLayout构造方法:

        GridLayout()默认只有一行,每个组件占一列

        GridLayout(int rows,int cols)指定容器的行数和列数

        GridLayout(int rows,int cols,int hgap,int vgap)指定容器的行数和列数以及组件之间的水平、垂直间距

     特点:组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变,组件始终占据网格的整个区域。缺点是总是忽略组件的最佳大小,所有组件的宽高都相同。

    GridBagLayout(网格包布局管理器)是最灵活、最复杂的布局管理器。与GridLayout布局管理器类似,不同的是,它允许网格中的组件大小各不相同,而且允许一个组件跨越一个或多个网格

    CardLayout(卡片布局管理器)卡片布局管理器将界面看作一些列卡片,在任何时候只有其中一张卡片是可见的,这张卡片占据容器的整个区域。

    不使用布局管理器:当一个容器被创建后,它们都会有一个默认的布局管理器。window、Frame和Dialog的默认布局管理器是BorderLayout,Panel的默认布局管理器是FlowLayout。如果不希望通过布局管理器来对容器进行布局,也可以调用容器的setLayout(null)方法,将布局管理器取消。在这种情况下,程序必须调用容器中每个组件的setSize()和setLocationO方法或者是setBounds()方法(这个方法接收四个参数;分别是左上角的x、y坐标和组件的长、宽)来为这些组件在容器中定位。

    AWT绘图:在java.awt包中专门提供了一个Craphis 是它相当于一个抽象的画笔,其中提供了各种经制图形的方法,使用Graphics类的方法就可以完成在组件上绘制图形。

      Graphics常用方法

      void setColor(Color c)将此图形上下文的颜色设置为指定颜色

      void setFont(Font f)将此图形上下文的字体设置为指定字体

      void drawLine(int xl,int yl.int x2,int y2)以(x1,y1)和(x2,y2)为端点绘制一条线段

      void drawRet(int x.int y.inwidth, int height)绘制指定矩形的边框矩形的左边缘和右边缘分别位于x和x+width,上边缘和下边缘分别位于y和y+ height

    void drawOval(int x, int y, intwidth, int height)绘制椭圆的边框。得到一个圆或椭圆,它刚好能放人由x.y.width和height参数指定的矩形中。椭圆覆盖区域的宽度为width+1像素,高度为height+1像素

    void fillRect ( int x, int y, intwidth, int height)用当前颜色填充指定的矩形。该矩形左边缘和右边缘分别位于x和x+:width-1,上边缘和下边缘分别位于y和y+ height- 1

    void fillOval ( int x, int y, intwidth, int height)用当前颜色填充外接指定矩形框的椭圆

    void drawString ( String str, intx,int y)使用此图形上下文的当前字体和颜色绘制指定的文本str.最左侧字符左下角位于(x,y)坐标

    注意:在组件第一次显示时,AWT线程都会自动去调用组性的paint(Graphics g方法,为该方法传人一个Graphics类型的对象用于绘制图形,因此,要想在组件中绘制图形,就需要重写它的paint()方法。

    Swing

    相对于AWT来说,Swing包中提供了更加丰富、便捷、强大的GUI组件,而且这些组件都是Java语言编写而成的,因此,Swing组件不依赖于本地平台,可以真正做到跨平台运行。通常来讲,我们把依赖于本地平台的AWT组件称大重级组件,而把不依赖本地平台的Swing组件称为轻量级组件。学习Swing组件的过程和学习AWT差不多,大部分的Swing组件都是JComponent类的直接或者间接子类,而JComponent类是AWT中java. awt. Container 的子类,说明Swing组件和AWT组件在继承树上形成了一定的关系

    JFrame:

    在swing组件中,常见的一个就是JFrame,它和Frame一样是一个独立存在的顶级窗口,不能放置在其他容器之中。JFrame 类和Frame类最大的区别JFrame类是提供了关闭窗口的功能,在程序中不需要添加窗体监听器,只需调用stDefaultCloseOperation()方法,然后将常量JFrame.EIXT_ON_CLOSE 作为参数传人即可,该参数表示点击窗口关闭我和时退出程序。

    JDialog:

    JDialog是Swing的另外一个真级窗口,它和Dialog一样都表示对话框。JDialog 对话框可分为两种:模态对话框和非模态对话框。所谓模态对话框是指用户需要等到处理完对话框后过能继续与其他窗口交万而非模态对话框允许用户在处理对话框的同时与其他窗口交互。对话框是模态或者非模态,可以在创建Dialog 对象时为构造方法传人参数来设置,也可以在创建JDialog对象后调用它的setModal()方法米进行设置

      JDialog 构造方法

        JDialog( Frame owner)功能描述,构造方法,用来创建一个非模态的对话框,owner为对话框所有者(顶级窗口JFrame)

        JDialog(Frame owner, String title)  构造方法创建一个具有指定标题的非模态对话框
        JDialog( Frame owner, boolean modal)创建个有指定模式的无标题对话框

    注意:

    列举了JDialog三个常用的构造方法,在这三个构造方法中都需要接收一个Frame类型的对象,表示对话框所有者,如果该对话框没有所有者,参数owner可以传人null,第三个构造方法中,参数modal用来指定JDialog窗口是模态还是非模态,如果modal值设置为true, 对话框就是模态对话框,反之则是非模态对话框,如果不设置modal的值,其默认值为false,也就是非模态对话框。

    中间容器:

     Swing组件中不仅具有JFrame和JDialog这样的顶级窗口,还提供了一些中间容器,这些容器不能单独存在只能放置在顶级窗口中。其中最常见的中间容器有两种:JPanel和JScrollPane,接下来分别来介绍这两种容器。

    ①JPanel: JPanel和AWT中的Panel组件使用方法基本一致,它是一个无边框,不能被移动、放大、缩小或者关闭的面板,它的默认布局管理器是FlowLayout。当然也可以使用JPanel带参数的构造函数JPanel( LayoutManager layout)或者它的setLayout()方法为其制定布局管理器。
    ②JscrollPane:与JPanel不同的是,JScrolPane是- -个带有滚动条的面板容器,而且这个面板兵能添加一个组件,如果想往JScrollPane面板中添加多个组件,应该先将组件添加到JPanel中,然后将JPanel添加到JScrollPane中。

      构造方法:    

    JScrollPane( )创建一个空的JScrllPane面板
    JScrollPane(Component view)创建个显示指定组件的JScolPane面板,只要组件的内容超过视图大小就会显示水平和垂直滚动条

    JScrollPane ( Component view,int vsbPolicy,int hsbPolicy)创建一个显示指定容器、并具有指定滚动条策略的JSrollPane.参数vsbPolicy和hsbPolicy分别表示垂直滚动条策略和水平滚动条策略,应指定为ScrollPaneConstants的静态常量,

    如下所示:

     HORIZONTAL SCROLLBAR AS_ NEEDED:表示水平滚动条只在需要时显示,是默认策略。

    HORIZONTAL SCROLLBAR NEVER:表示水平滚动条永远不显示

        HORIZONTAL SCROLLBAR ALWAYS:表示水平滚动条一直显示

    文本组件: 

      1、JTextField:称为文本框,它只能接收单行文本的输入

        构造方法:

          JTextField()创建个空的文本框 ,初始字 符串为null

          JTextFiled(int columns)创建一个具有指定列数的文本框,初始字符串为null

          JTextField( String text)创建一个显示指定初始字符串的文本框

          JTextField String text , int column)创建一个具有指定列数并显示指定初始字符串的文本框

        JTextField 有一个子类JPaswordText,它表示一密码框,只能接收用户的单行输人,但是在此框中不显示用户输人的真实信息,而是通过显示指定的回显字符作为占位符。新创建的密码框默认的回显字符为*。JPasswordText和JTextField的构造方法相似。

      2、JTextArea: JTextArea称为文本域,它能接收多行文本的输人,使用JTextArea构造方法创建对象时可以设定区域的行数

        构造方法:    

    TextArea()功能说明创建一个空的文本域
    JTextArea(String text)创建显示指定初始字符串的文本域
    JTextArea(int rows,int columns)创建具有指定行和列的空的文本域

    JTextArea(String text,int rows, int columns)创建显示指定初始文本并指定了行列的文本域

       3、菜单组件:在GUI程序中,菜单是很常见的组件,利用Swing提供的菜单组件可以创建出多种样式的菜单。

             在GUI程序中,创建下拉式菜单需要使用三个组件: MenuBar(菜单栏)、JMenu(菜单)和JMenultem(菜单项),
     ①JMenuBar. JMenuBar表示一个水平 的菜单栏,它用来管理菜单,不参与同用户的交互式操作。菜单栏可以放在容器的任何位置但通常情况下会使用顶级窗口(如JFrame JDialog)的setJMenuBar(JMenuBar menuBar) 方法将它放置在顶级窗口的顶部。JMenuBar有一个无参构造函数,创建菜单栏时,只需要使用new关键字创建JMenubar对象即可。创建完菜单栏对象后,可以调用它的add(JMenuc)方法为其添加JMenu菜单。

    ②JMenu。JMenu表示一个菜单,它用来整合管理菜单项。菜单可以是单-层次的结构,也可以是多层次的结构。大多情况下.使用JMenu(String text)构造丽数创建JMenu菜单,参数text表示菜单上的文本。

      常用方法:

    woid JMenultem add(JMenultem menuItem)将菜单项添加到菜单末尾,返回此菜单项
    void addSeparator( )分隔符添加到菜单的末尾

    JMenultem getItem(int pos)返回指定索引处的菜单项,第一:个菜单项的索引为0
    int getItemCount()返回菜单上的项数,菜单项和分隔符都计算在内

    void JMenultem insert(JMenultem menuItem,int pos)在指定索引处插人菜单项

    void insertSeparator(int pos)在指定索引处雨人分隔符

    void remove(int pos)从菜单中移除指定索引处的菜单项
    void remove(JMenultem menutem)从菜单中移除指定的菜单项

    void removeAll()从菜单中移除所有的菜单项

    ③JMenultem。JMenultem 表示一个菜单项,它是菜单系统中最基本的组件。和JMenu菜单一样,在创建JMenultem菜单项时,通常会使用JMenumItem( String text)这个构造方法为菜单项指定文本内容。

      JMenultem继承自AbstractButton类的,因此可以把它看成是一个按钮,如果使用无参的构造方法创建了一个菜单项,则可以调用从AbstractButton类中继承的setText(String text)方法和setIcon( )方法为其设置文本和图标。

    弹出式菜单:

      对于弹出式菜单,相信大家也不会陌生,在Windows桌面点击鼠标右键会出现一个菜单,那就是弹出式菜单。在Java的Swing组件中.弹出式菜单用PopupMenu表示

        PopupMenu弹出式菜单和下拉式菜单-样都通过调用addO)方法添加JMenultem菜单项,但它默认是不可见的,如果想要显示出来,则必须调用它的show (Component

        invoker,int x.int y)方法该方法中参数invoker表示JPopupMenu菜单显示位置的参考疑物组件,x和y表示invoker组件坐标空间中的一个坐标,显示的是JPopupMenu菜单的左上角坐标。
  • 相关阅读:
    IOS快速集成下拉上拉刷新
    无限互联IOS电影项目视频笔记
    Unix时间戳(Unix timestamp)转换工具
    ***php(codeigniter)中如何重定向
    CodeIgniter 错误: In order to use the Session class you are required to set an encryption key
    一个Form中2个按钮,PHP后台如何判断提交的是哪一个按钮
    PHP 判断是否包含某字符串
    Linux那些事儿之我是Hub(大结局)挂起自动化【转】
    Linux USB Host-Controller的初始化代码框架分析【转】
    urb传输的代码分析【转】
  • 原文地址:https://www.cnblogs.com/0405mxh/p/10286440.html
Copyright © 2020-2023  润新知