第九章:GUI(图形用户界面)

一曲冷凌霜 提交于 2019-12-25 05:28:45

GUI全称Graphical User Interface,即图形用户界面。

9.1AWT概述

AWT是用于创建图形用户界面的一个工具包,它提供了一系列用于实现图形界面的组件,如窗口、按钮、文本框、对话框等。在AWT中组件分为两大类,这两类的基类分别是Component和MenComponent。其中,MenComponent是所有与菜单相关组件的父类,Component则是除菜单外其他AWT组件的父类,它表示一个能以图形化方式显示出来,并可与用户交互的对象。

Component类通常被称为组件,根据Component的不同作用,可将其分为基本组件类和容器类。基本组件类是诸如按钮、文本框之类的图形界面元素,而容器类则是通过Component的子类Container实例化的对象。Container类表示容器,它是一种特殊的组件,可以用来容纳其他组件。Container容器又分为两种类型,分别是Window和Panel,接下来对这两种类型进行详细讲解。

  1. Window

Window类是不依赖其他容器而独立存在的容器,它有两个子类,分别是Frame类和Dialog类。Frame类用于创建一个具有标题栏的框架窗口,作为程序的主界面。

  1. Panel

Panel也是一个容器,但是它不能单独存在,只能存在其他容器(Window或其子类)中,一个Panel对象代表了一个长方形的区域,在这个区域中可以容纳其他组件。

事件处理机制专门用于响应用户的操作。

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

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

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

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

9.3.1窗体事件

当对窗体进行操作时,比如窗体的打开、关闭、激活、停用等,这些动作都属于窗体事件,JDK中提供了一个类WindowEvent用于表示这些窗体事件。在应用程序中,当对窗体事件进行处理时,首先需要定义一个类实现WindowListener接口作为窗体监听器,然后通过addWindowListener()方法将窗体对象与窗体监听器绑定。

9.3.2鼠标事件

JDK中提供了一个MouseEvent类用于表示鼠标事件,几乎所有的组件都可以产生鼠标事件,处理鼠标事件时首先需要通过实现MouseListener接口定义监听器,也可以通过继承适配器MouseAdapter类实现,然后调用addMouseListener()方法将监听器绑定到事件源对象。

9.3.3键盘事件

JDK中提供了一个KeyEvent类表示键盘事件,处理KeyEvent事件的监听器对象需要实现KeyListener接口或者继承KeyAdapter类。

9.3.4动作事件

动作事件与前面三种事件有所不同,它不代表某个具体的动作,只是表示一个动作发生了,动作事件用AetionEvent类表示,处理AetionEvent事件的监听器对象需要实现AetionListener接口,但监听器对象在监听动作时,不会像鼠标事件一样处理鼠标个别的移动和单击的细节,而是去处理“被按钮下”“这样”“有意义“的事件。

9.4布局管理器

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

9.4.1FlowLayout

流式布局管理器是最简单的布局管理器,在这种布局下,容器会将组件按照添加顺序从左向右放置,当到达容器的边界时,会自动将组件放到下一行的开始位置。这些组件可以左对齐、居中对其(默认方式)或右对齐的方式排列。FlowLayout对象有三个构造方法。

FlowLayout构造方法

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

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

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

9.4.2BorderLayout

BorderLayout(边界布局管理器)是一种较为复杂的布局方式,它将容器划分为五个。

BorderLayout的好处就是可以限定各区域的边界,当用户改变容器窗口大小时,各个组件的相对位置不变。但需要注意的是,向BorderLayout的布局管理器添加组件时,如果不指定添加到哪个区域,则默认添加到CENTER区域,并且每个区域只能放置一个组件,如果向一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。

9.4.3 GridLayout

GridLayout网络布局管理器)使用纵横线将容器分成n行m列大小相等的网格,每个网格中放置一个组件。于FlowLayout不同的是,放置在GridLayout布局管理器中的组件将自动占据网格的整个区域。

GridLayout构造方法

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

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

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

9.4.4GridBagLayout

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

使用GridBagLayout布局管理器的步骤如下;

  1. 创建GridBagLayout布局管理器,并使容器采用该布局管理器

  2. 创建GridBagContraints对象(布局约束条件),并设置该对象的相关属性

  3. 调用GridBagBagLayout对象的setConstraints()方法建立GridBagContraints对象和受控组件之间的关联

  4. 向容器中添加组件

GridBagContraints常用属性

Gridx和gridy:设置组件的左上角所在网格的横向和纵向索引(即所在的行和列)。如果将gridx和gridy的值设置为GridBagContraints,RELATIVE(M默认值),表示当前组件紧跟在上一个组件后面

Gridwidth和gridheight:设置组件横向、纵向跨越几个网格,两个属性的默认值都是1.如果把这两个属性的值设为GridBagContraints,REMAINER,表示当前组件在其行或其列上为最后一个组件;如果把这两个属性的值设为GridBagContraints.RELATIVE,表示当前组件在其行或列上为倒数第二个组件

Fill:如果当组件的显示区域大于组件需要的大小,设置是否以及如何改变组件大小,该属性接收以下几个属性值;

NONE:默认,不改变组件大小

HORIZONTAL:使组件水平方向足够长以填充显示区域,但是高度不变

VERTICAL:使组件垂直方向足够高以填充显示区域,但长度不变

BOTH:使组件足够大,以填充整个显示区域

Weightx和weighty:设置组件占领容器中多余的水平方向和垂直方向空白的比例(也称为权重)。假设容器的水平方向放置三个组件,其weightx分别1,2,3,当容器宽度增加60个像素时,这三个容器分别增加10、20和30的像素。这两个属性的默认值是0,即不占领多余的空间

9.4.5CardLayout

在操作程序时,我们经常会通过选项卡按钮来切换程序中的界面,这些界面就相当于一张张卡片,而管理这些卡片的布局管理器就是卡片布局管理器(CardLayout)。

CardLayout常用方法

Void fist(Container parent):显示parent容器的第一张卡片

Void last(Container parent):显示parent容器的最后一张卡片

Void previous(Container parent):显示parent容器的前一张卡片

Void next(Container parent):显示parent容器的下一张卡片

Void show(Container parent,String name):显示parent容器中名称为name的组件,如果不存在,则不会发生任何操作

9.4.6不使用布局管理器

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

9.5AWT绘图

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

Graphics常用方法

Void setColer(Color c):将此图形上下文的当前颜色设置为指定颜色

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

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

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

  1. setColor()方法用于指定上下文颜色,方法中接收一个Color类型的参数。

  2. setFont()方法用于指定上下文字体,方法中接收一个Font类型的参数。

  3. drowRect()方法和drawOval()方法用于绘制矩形和椭圆形的边框,fillRect()和fillOval()方法用于使用当前的颜色填充绘制完成的矩形和椭圆形。

  4. drawstring()方法用于绘制一段文本,第一参数str表示绘制的文本内容,第二个和第三个参数x,y为绘制文本的左下角坐标。

9.6.1JFrame

在Swing组件中,最常见的一个就是JFrame,它和Frame一样是一个独立存在的顶级窗口,不能放置在其他容器之中,JFrame支持通用窗口所有的基本功能,例如窗口最小化、设定窗口大小等。

JDialog是Swing的另一个顶级窗口,它和Dialog一样都表示对话框。JDialog对话框可分为两种:模态对话框和非模态对话框。所谓模态对话框是指用户需要等到处理完对话框后才能继续与其他窗口交互,而非模态对话框允许用户在处理对话框的同时与其他窗口交互。

对话框是模态或者非模态,可以在创建Dialog对象时为构造方法传入参数来设置,也可以在创建JDialog对象后调用它的SetModal()方法来进行设置,JDialog常见的构造方法。

JDialog构造方法

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

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

JDialog(Frame owner,Boolean modal):创建一个有指定模式的无标题对话框

9.6.3中间容器

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

  1. JPanel:JPanel和AWT中的Panel组件使用方法基本一致,它是一个无边框,不能被移动、放大、缩小或者改变的面板,它的默认布局管理器是FlowLayout。当然也可以使用JPanel带参数的构造函数JPanel(LayoutManager Lavout)或者它的seLayout()方法为其制定布局管理器。

  2. JScroIIPane:与JPanel不同的是,JScroIIPane是一个带有滚动条的面板容器,而且这个面板只能添加一个组件,如果想往JScroIIPane面板中添加多个组件,应该先将组件添加到JPanel中,然后将JPanel添加到JScroIIPane中。

JScroIIPane构造方法

JScroIIPane():创建一个空的JScroIIPane面板。

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

JScroIIPane(Component view,int vsbpolicy,int
hsbPolicy):创建显示指定容器、并且有指定滚动条策略的JScroIIPane,参数vsbpolicy和 hsbPolicy分别表示垂直滚动条策略和水平滚动条策略,应指定为ScroIIPaneConstants的静态常量,如下所示:

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

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

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

JScrollPane的方法

Void setHorizontallBarPolicy(int policy):指定水平滚动条策略,即水平滚动条何时显示在滚动面板上

Void setVerticalBarPolicy(int policy):指定垂直滚动条策略,即垂直滚动条何时显示在滚动面板上

Void setViewportView(Component view):设置在滚动面板显示的组件

9.6.4文本组件

文本组件用于接收用户输入的信息或向用户展示信息,其中包括文本框(JTextField)、文本域(JTextArea)等,它们都有一个共同父类JTextComponent,JTextComponent是一个抽象类。

JTextComponent常用方法

String String getText():返回文本组件中所有的文本内容

String getSeletedText():返回文本组件中选定的文本内容

Void selectAll():在文本组件中选定所有内容

Void setEditable():设置文本组件为可编辑或者不可编辑状态

Void setText(String text):设置文本组件的内容

Void replaceSelection(String content):用给定的内容替换当前选定的内容

JTextField:JTextField称为文本框,它只能接收单行文本的输入,JTextField常用的构造方法。

JTextField构造方法

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

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

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

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

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

JTextArea构造方法

JTextArea():创建一个空的文本域

JTextArea(String text):创建显示指定初始字符串的文本域

JTextArea(int rows,int
columns):创建具有指定行和列的空的文本域

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

9.6.5按钮组件

在Swing中常见的按钮租价有JButton、JCheckBox、JRadioButton等,它们都是抽象类AbstracButton类的直接或间接子类,在AbstracButton类中提供了按钮组件通用的一些方法。

AbstracButton常用方法

Lcon getlcon()和void
setlcon(lcon icon):设置或者获取按钮的图标

String getText()和void
set Text(String text):设置或者获取按钮文本

JCheckBox
JCheckBox组件被称为复选框,它有选中(是)/未选中(非)两种状态,如果用户想接收的输入只有“是”和“非”,则可以通过复选框来切换状态。如果复选框有多个,则用户可以选中其中一个或者多个。

JCheckBox构造方法

JCheckBox():创建一个没有文本信息,初始状态未被选中的复选框

JCheckBox(String text):创建一个带有文本信息,初始状态未被选中的复选框

JCheckBox(String text,Boolean selected):创建一个带有文本信息,并指定初始状态(选中/未选择)的复选框

JRadioButton
JRadioButton组件被称为单选按钮,与JCheckBox复选框不同的是,单选按钮只能选中一个,就像收音机上的电台选择按钮,当按下一个,先前按下的按钮就会自动弹出,对于JRadioButton按钮来说,当一个按钮被选中时,先前被选中的按钮就会自动取消选中。

由于JRadioButton组件本身并不具备这种功能,因此若想实现JRadioButton按钮之间的互斥,需要使用javax,swing ButtonGroup类,它是一个不可见的组件,不需要将其增加到容器中显示,只是在逻辑上表示一个单选按钮。将多个JRadioButton按钮添加到一个单选按钮组对象中就能实现按钮的单选按钮。

JRadioButton构造方法

JRadioButton():创建一个没有文本信息、初始状态未被选中的单选框

JRadioButton(String text):创建一个带有文本信息、初始状态未被选定的单选框

JRadioButton(String text,Boolean selected):创建一个带有文本信息,并指定初始化状态(选中/未选中)的单选框

9.6.6 JComboBox

JComboBox组件被称为组合框或者下拉列表框,它将所有选项折叠收藏在一起,默认显示的是第一个添加的选项。当用户点击组合框时,会出现下拉式的选择列表,用户可以从中选择其中一项并显示。

JComboBox组合框组件分为可编辑和不可编辑两种形式,对于不可编辑的组合框,用户只能在现有的选项列表中进行选择,而对于可编辑的组合框,用户既可以在现有的选项中选择,也可以自己输入新的内容。需要注意的是,自己输入的内容只能作为当前项显示,并不会添加到组合框的选项列表中。

JComboBox构造方法

JComboBox():创建一个没有可选项的组合框

JComboBox(Object[]items):创建一个组合框,将Object数组中的元素作为组合框的下拉列表选项

JComboBox(Vector items):创建一个组合框,将Vector集合中的元素作为组合框的下拉列表选项

JComboBox常用方法

Void addItem(Object anObject):为组合框添加选项

Void insertItemAt(Object anObject,int
index):在指定的索引处插入选项

Object getItemAt(int index):返回指定索引处选项,第一个选项的索引为0

Int getItemCount():返回组合框中的数目

Object getSelectedItem():返回当前所选项

Void removeAllItems():删除组合框中所有的选项

Void removeItem(Object object):从组合框中删除指定选项

Void removeItemAt(int index):移除指定索引处的选项

Void setEditable(Boolean aFlag):设置组合框的选项是否可编辑,aFlag为true则可编辑,反之则不可编辑

9.6.7 菜单组件

1.下拉式菜单

在GUI程序中,创建下拉式菜单需要使用三个组件:JMenuBar(菜单栏)、JMenu(菜单)和JMenuItem(菜单项)。

  1. JMenuBar。JMenuBar表示一个水平的菜单栏,它用来管理菜单,不参与同用户的交互式操作。

  2. JMenu。JMenu表示一个菜单,它用来整合管理菜单项。菜单可以是单一层次的结构,也可以是多层次的结构。

JMenu常用方法

Void JMenuItem add(JMenuItem menuItem):将菜单项添加到菜单末尾,返回此菜单项

Void addSeparator():将分隔符添加到菜单的末尾

JMenuItem getItem(int pos):返回指定索引的菜单项,第一个菜单项的索引为0

Int getItemCount():返回菜单上的项数,菜单项和分隔符都计算在内

Void JMenuItem insert(JMenuItem
menuItem,int pos):在指定索引处插入菜单项

Void insertSeparator(int pos):在指定索引处插入分隔符

Void remove(int pos):从菜单中移除指定索引的菜单项

Void remove(JMenuItem menuItem):从菜单中移除指定的菜单项

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

关于创建和添加下拉式菜单,一般分为以下几个步骤

  1. 创建一个JMenuBar菜单栏对象,将其设置在JFrame窗口的顶部。

  2. 创建JMenu菜单对象,将其添加到JMenuBar菜单栏中

  3. 创建JMenuItem菜单项,将其添加到JMenu菜单中。

2,弹出式菜单

JPopupMenu弹出式菜单和下拉式菜单一样都通过调用add()方法添加JMenuItem菜单项,但它默认是不可见的,如果想要显示出来,则必须调用它的show(Component invoker,int x,int y)方法,该方法中参数invoker表示JPopupMenu菜单显示位置的参考组件,x和y表示invoker组件坐标空间中的一个坐标,显示的是JPopupMenu菜单的左上角坐标。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!