图形界面设计

  • AWT和Swing
  • 组件
  • 顶层容器
  • JFrame类常用的构造方法
  • 内容窗格
  • 面板
  • JPanel类常用的构造方法
  • AWT滚动条组件
  • 标签
  • 按钮
  • JButton构造方法
  • JButton类常用方法
  • 切换按钮、复选按钮及单选按钮
  • JToggleButton
  • FlowLayout布局管理器
  • 3种构造方法
  • BorderLayout布局管理器
  • GridLayout布局管理器
  • CardLayout
  • CardLayout有两种构造方法
  • BoxLayout布局管理器
  • 事件处理模型
  • 事件的种类
  • 事件适配器
  • 颜色
  • 文字
  • 文字构造方法
  • Graphics类的基本功能
  • Graphics2D绘图


AWT和Swing

图形用户界面(Graphical User Interface,GUI)是大多数程序不可缺少的部分.Java的图形用户界面由各种组件构成,在java.awt包和javax.swing包中定义了多种用于创建图形用户界面的组件类。设计图形用户界面时一般有3个步骤,分别是选取组件、设计布局及响应事件。
不包含本地代码的Swing组件被称为“轻量级”组件,而包含本地代码的AWT组件被称为“重量级”组件。

组件

所谓容器组件是指可以包含其他组件的组件,又分为顶层容器和一般用途容器。而非容器组件则必须要包含在容器中。Java为所有容器类定义了父类Container,容器的共有操作都定义在Container类中。

顶层容器

Swing中提供了4种顶层容器,分别为JFrame、JApplet、JDialog和JWindow。创建应用程序时需要使用JFrame。创建小应用程序时使用JApplet,它被包含在浏览器窗口中。创建对话框时使用JDialog。JWindow是一个不带有标题行和控制按钮的窗口,通常很少使用。

JFrame类常用的构造方法

·JFrame( ):构造一个初始时不可见、无标题的新框架窗体。
  ·JFrame(String title):创建一个初始时不可见、具有指定标题的新框架窗体。
  JFrame类中定义了一些相关方法,另外也从祖先类中继承了一些方法。常用的方法有以下几种。
  ·void setBounds(int x,int y,int width,int height):移动并调整框架大小。左上角位置的横纵坐标分别由x和y指定,框架的宽高分别由width和height指定。
  ·void setSize(int width,int height):设置框架的大小,宽度是width,高度是height。
  ·void setBackground(Color bg):使用颜色bg设置框架的背景色。
  ·void setVisible(boolean aFlag):设置框架可见或不可见。
  ·void pack( ):调整框架的大小,以适合其子组件的首选大小和布局。
  ·void setTitle(String title):设置框架的标题为字符串title。
  ·Container getContentPane( ):返回此框架窗体的内容窗格对象。
  ·void setLayout(Layout Manager manager):设置布局管理器。

创建窗口用到的JFrame和JButton类定义在javax.swing包中,而BorderLayout定义在java.awt包中,程序的最开始要引入这两个包。

内容窗格

4个顶层容器中的每一个都有一个内容窗格。除菜单之外,顶层容器中的组件都放在这个内容窗格中。有两种方法可以将组件放入内容窗格中,一种方法是通过顶层容器getContentPane( )方法获得其默认的内容窗格。getContentPane( )方法的返回类型为java.awt.Container,它仍然是一个容器。然后将组件添加到内容窗格中,例如:
  Container contentPane=frame.getContentPane( );
  contentPane.add(button,BorderLayout.CENTER);
  顶层容器默认内容窗格的布局管理器是BorderLayout,而JPanel默认的布局管理器是FlowLayout。

面板

是用途广泛的容器。与顶层容器不同的是,面板不能独立存在,必须被添加到其他容器内部。

JPanel类常用的构造方法

·JPanel( ):创建具有FlowLayout布局的新面板。
  ·JPanel(LayoutManager layout):创建具有指定布局管理器的新面板。使用public Component add(Component comp)方法可以将指定组件追加到面板中。
  JScrollPane是带有滚动条的面板,它是Container类的子类。但是只能添加一个组件。所以当有多个组件需要添加时,一般是先将多个组件添加到JPanel中,然后再将这个JPanel添加到JScrollPane中。JScrollPane类中常用的构造方法有以下几种。
  ·JScrollPane( ):创建一个空的JScrollPane,需要时水平和垂直滚动条都可显示。
  ·JScrollPane(Component view):创建一个显示指定组件内容的JScrollPane,只要组件的内容超过视图大小,就会显示水平和垂直滚动条。
  JScrollPane类中常用的方法有以下几种。
  ·void setHorizontalScrollBarPolicy(int policy):确定水平滚动条何时显示在滚动窗格上。参数policy的可选值为下列三者之一。
  ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED:需要时可见。
  ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER:总是不可见。
  ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS:总是可见。
  ·void setVerticalScrollBarPolicy(int policy):确定垂直滚动条何时显示在滚动窗格上。参数policy的可选值为下列三者之一:
  ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED:需要时可见。
  ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER:总是不可见。
  ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS:总是可见。

AWT滚动条组件

·Scrollbar( ):构造一个新的垂直滚动条。
  ·Scrollbar(int orientation):构造一个具有指定方向的新滚动条。orientation指示滚动条的方向,其值是Scrollbar.HORIZONTAL或是Scrollbar.VERTICAL,分别指示滚动条是水平滚动条,还是垂直滚动条。
  ·Scrollbar(int orientation,int value,int visible,
  int minimum,int maximum):构造一个新的滚动条,它具有指定的方向、初始值、可视量、最小值和最大值。orientation的值如前所述,value是滚动条的初始值,visible是滚动条的可视量,通常由滑动块的大小表示,minimum是滚动条的最小值,maximum是滚动条的最大值。

标签

标签(JLabel)对象是最简单的Swing组件,通常用于显示提示性的文本信息或图标,不可被编辑,其构造方法有以下6种形式。
  ·JLabel( ):创建一个既不显示文本信息又不显示图标的空标签。
  ·JLabel(Icon image):创建一个显示图标的标签。
  ·JLabel(String text):创建一个显示文本信息的标签。
  ·JLabel(Icon image,int horizontalAlignment):创建一个显示图标的标签,水平对齐方式由int型参数horizontalAlignment指定。
  ·JLabel(String text,int horizontalAlignment):创建一个显示文本信息的标签,水平对齐方式由int型参数horizontalAlignment指定。
  ·JLabel(String text,Icon icon,int horizontalAlignment):创建一个同时显示文本信息和图标的标签,水平对齐方式由int型参数horizontalAlignment指定。
  构造方法中,表示水平对齐方式的int型参数horizontalAlignment的取值可以为JLabel.LEFT,JLabel.RIGHT和JLabel.CENTER常量,分别表示左对齐、右对齐和居中对齐。

按钮

经常用到的按钮有4种形式:JButton、JToggleButton、JCheckBox和JRadioButton
它们均是AbstractButton的子类或间接子类。各种按钮上都可以设置文本、设置图标、注册事件侦听程序。在AbstractButton中定义了按钮所共有的一些方法,例如addActionListener( )、setEnabled( )、setText( )和setIcon( )等。

JButton构造方法

·JButton( ):创建一个既没有显示文本又没有图标的按钮。
  ·JButton(Icon icon):创建一个没有显示文本但有图标的按钮。
  ·JButton(String text):创建一个有显示文本但没有图标的按钮。
  ·JButton(String text,Icon icon):创建一个既有显示文本又有图标的按钮。
 当用户用鼠标单击按钮时,事件处理系统将向按钮发送一个ActionEvent事件类对象,如果程序需要对此做出反应,则需要使用addActionListener( ) 为按钮注册事件侦听程序并实现ActionListenner接口。

JButton类常用方法

·public void setMnemonic(int mnemonic):设置当前按钮的键盘助记符。
  ·public void setText(String text):设置按钮的文本。
  ·public String getText( ):返回按钮的文本。
  ·public void setToolTipText(String text):设置要显示的提示文本。
  ·public void addActionListener(ActionListenerl):为按钮添加事件侦听程序。

切换按钮、复选按钮及单选按钮

除了普通按钮JButton外,还有切换按钮(JToggleButton)、复选按钮(JCheckBox)和单选按钮(JRadioButton)。

JToggleButton

具有两种状态的按钮,即选中状态和未选中状态。
JToggleButton的构造方法主要有以下几种格式。
  ·JToggleButton( ):创建一个既没有显示文本又没有图标的切换按钮。
  ·JToggleButton(Icon icon):创建一个没有显示文本但有图标的切换按钮。
  ·JToggleButton(Icon icon,boolean selected):创建一个没有显示文本但有图标和指定初始状态的切换按钮。
  ·JToggleButton(String text):创建一个有显示文本但没有图标的切换按钮。
  ·JToggleButton(String text,boolean selected):创建一个有显示文本和指定初始状态但没有图标的切换按钮。
  ·JToggleButton(String text,Icon icon):创建一个既有显示文本又有图标的切换按钮。
  ·JToggleButton(String text,Icon icon,boolean selected):创建一个既有显示文本又有图标和指定初始状态的切换按钮。
  构造方法中如果没有指定按钮的初始状态,则默认处于未选中状态。
  JCheckBox和JRadioButton都是JToggleButton的子类,构造方法的格式与JToggleButton相同,它们也都具有选中和未选中两种状态。
  在JToggleButton类中定义了一个isSelected( )方法,通过该方法可以获知按钮的当前状态:当返回值为true时表示处于选中状态,而返回值为false时则表示处于未选中状态。

FlowLayout布局管理器

每个容器都有一个默认的布局管理器,可以通过容器的setLayout( )方法改变容器的布局管理器。FlowLayout定义在java.awt包中。

3种构造方法

·FlowLayout( ):创建一个默认的FlowLayout布局管理器,居中对齐,默认的水平和垂直间距是5个像素。
  ·FlowLayout(int align):创建一个新的FlowLayout布局管理器,对齐方式是指定的,默认的水平和垂直间距是5个像素。
  ·FlowLayout(int align,int hgap,int vgap):创建一个新的FlowLayout布局管理器,具有指定的对齐方式以及指定的水平和垂直间距。
align的可取值有FlowLayout.LEFT、FlowLayout.RIGHT和FlowLayout.CENTER三种形式,分别对应组件的左对齐、右对齐和居中对齐方式。
与其他布局管理器不同的是,FlowLayout布局管理器并不强行设定组件的大小,而是允许组件拥有它们自己所希望的尺寸。每个组件都有一个getPreferredSize( )方法,容器的布局管理器会调用这一方法取得每个组件希望的大小。

BorderLayout布局管理器

BorderLayout是顶层容器中内容窗格的默认布局管理器,它提供了一种较为复杂的组件管理方案。
容器被划分成5个区域,分别代表容器的上部(North)、下部(South)、左部(West)、右部(East)和中部(Center),分别使用常量BorderLayout.NORTH、BorderLayout.SOUTH、BorderLayout.WEST、BorderLayout.EAST和BorderLayout.CENTER来表示。
如果在add( )方法中没有指定将组件放到哪个区域,则默认地会被放置在Center区域,
在容器的每个区域,可以加入一个组件。BorderLayout定义在java.awt包中,BorderLayout布局管理器有两种构造方法。
  ·BorderLayout( ):构造一个组件之间没有间距的新的BorderLayout布局管理器。
  ·BorderLayout(int hgap,int vgap):用指定的组件之间的水平和垂直间距构造一个BorderLayout布局管理器。在BorderLayout布局管理器的管理下,组件必须通过add( )方法加入到容器中的指定区域。

GridLayout布局管理器

GridLayout是一种网格式的布局管理器,它将容器空间划分成若干行乘若干列的网格,组件依次放入其中,每个组件占据一格。
  GridLayout定义在java.awt包中,有3种构造方法,分别如下。
  ·GridLayout( ):创建一个只有一行的网格,网格的列数根据实际需要而定。
  ·GridLayout(int rows,int cols):创建具有指定行数和列数的网格布局。
  ·GridLayout(int rows,int cols,int hgap,int vgap):创建具有指定行数和列数,且有指定水平间距和垂直间距的网格布局。

CardLayout

定义在java.awt包中的布局管理器,这是一种卡片式的布局管理器,它将容器中的组件处理为一系列卡片,每一时刻只显示出其中的一张,而容器充当卡片的容器。

CardLayout有两种构造方法

·CardLayout( ):创建一个默认的无间距的新的CardLayout布局管理器。
  ·CardLayout(int hgap,int vgap):创建一个具有指定的水平和垂直间距的新的CardLayout布局管理器。
  除了可以使用add( )将组件加入容器外,CardLayout还有以下一些常用方法。
  ·public void first(Container parent):翻转到容器的第一张卡片。
  ·public void next(Container parent):翻转到指定容器的下一张卡片。如果当前的可见卡片是最后一张,则此方法翻转到布局的第一张卡片。
  ·public void previous(Container parent):翻转到指定容器的前一张卡片。如果当前的可见卡片是第一张,则此方法翻转到布局的最后一张卡片。
  ·public void last(Container parent):翻转到容器的最后一张卡片。
  ·public void show(Container parent ,String name)翻转到已添加到此布局的具有指定name的卡片。如果不存在这样的卡片,则不发生任何操作。

BoxLayout布局管理器

BoxLayout是定义在javax.swing包中的另一种常用布局管理器,它将容器中的组件按水平方向排成一行或按垂直方向排成一列。
。BoxLayout构造方法只有一个,BoxLayout(Container target,int axis):创建一个将沿给定轴放置组件的布局管理器。其中,Container型参数target指明是为哪个容器设置此BoxLayout布局管理器,int型参数axis指明组件的排列方向,通常使用的是常量BoxLayout.X_AXIS或BoxLayout.Y_AXIS,分别表示按水平方向排列或按垂直方向排列。
  在javax.swing包中定义了一个专门使用BoxLayout的特殊容器——Box类,Box类中提供了创建Box实例的静态方法。
  ·public static BoxcreateHorizontalBox( ):使用水平方向的BoxLayout。
  ·public static BoxcreateVerticalBox( ):使用垂直方向的BoxLayout。
  除了创建Box实例的静态方法之外,Box类中还提供了一些创建不可见组件的方法,例如:
  ·public static Component createHorizontalGlue( )。填满水平空间
  ·public static Component createVerticalGlue( )。填满垂直空间
  ·public static Component createHorizontalStrut(int width)。固定水平
  ·public static Component createVerticalStrut(int height)。固定垂直
  ·public static Component createRigidArea(Dimensiond)。指定大小的组件
  这些不可见组件可以增加可见组件之间的距离。

事件处理模型

为了接收并处理某类用户事件,组件必须注册相应的事件处理程序,这种事件处理程序称为事件侦听程序(Listener,也称为侦听器),它是实现了对应侦听程序接口的一个类。
  给事件注册侦听事件的步骤:
  ①程序中引入java.awt.event包。
  import java.awt.event;
  ②给所需的事件源对象注册事件侦听程序。事件源对象.addXXXListener(XXXListener);
  ③实现相应的方法。若某个侦听程序接口包含多个方法,则需要实现所有的方法。

事件的种类

在java.awt.event包和javax.swing.event包中还定义了很多其他事件类,例如,ActionEvent、ItemEvent、MouseEvent和KeyEvent等,每种事件类都有一个对应的接口,接口中声明了一个或多个抽象的事件处理方法。凡是需要接收并处理事件类对象的类,都需要实现相应的接口。

事件类型

组件

接口名称

方法及说明

ActionEvent

JButton、


JCheckBox、


JComboBox、


JMenuItem、


JRadioButton

ActionListener

actionPerformed(ActionEvent)单击按钮、选择菜单项,或在文本框中按〈Enter〉键时

AdjustmentEvent

JScrollBar

Adjustment

Listener

adjustmentValueChanged

(AdjustmentEvent)

当改变滚动条滑块位置时

ComponentEvent

JComponent

类及其子类

Component


Listener

componentMoved

(ComponentEvent)组件移动时


componentHidden

(ComponentEvent)组件隐藏时


componentResized

(ComponentEvent)组件缩放时


componentShown

(ComponentEvent)组件显示时

ContainerEvent

JContainer

类及其子类

Container


Listener

componentAdded(ContainerEvent)

添加组件时


componentRemoved

(ContainerEvent)

移除组件时

FocusEvent

同Component


Event

Focus


Listener

focusGained(FocusEvent)

组件获得焦点时


focusLost(FocusEvent)

组件失去焦点时

ItemEvent

JCheckBox、


JCheckboxMenuItem、JComboBox、

Item


Listener

itemStateChanged(ItemEvent)

选择复选框、选项框、单击列表框、

选中带复选框时

KeyEvent

同Component


Event

KeyListener

keyPressed(KeyEvent)键按下时


keyReleased(KeyEvent)键释放时


keyTyped(KeyEvent)击键时

Mouse


ButtonEvent

同Component


Event

MouseListener

mousePressed(MouseEvent)

鼠标键按下时


mouseReleased(MouseEvent)

鼠标键释放时


mouseEntered(MouseEvent)

鼠标进入时


mouseExited(MouseEvent)

鼠标离开时


mouseClicked(MouseEvent)

单击鼠标时

Mouse


MotionEvent

同Component


Event

MouseMotionListener

mouseDragged(MouseEvent)

鼠标拖放时、


mouseMoved(MouseEvent)

鼠标移动时

TextEvent

JTextField、


JTextArea

TextListener

textValueChanged(TextEvent)

文本框、文本区内容修改时

WindowEvent

JFrame、


JWindow、


JDialog

Window


Listener

windowClosing(WindowEvent)

窗口关闭时


windowOpened(WindowEvent)

窗口打开后


windowlconified(WindowEvent)

窗口最小化时


windowDeiconified(WindowEvent)

最小化窗口还原时


windowClosed(WindowEvent)

窗口关闭后


windowActivated(WindowEvent)

窗口激活时


windowDeactivated(WindowEvent)

窗口失去焦点时

事件适配器

为了编程方便,Java为一些声明了多个方法的Listener接口提供了相对应的适配器类。

接口名称

适配器名称

接口名称

适配器名称

Component


Listener

ComponentAdapter

MouseListener

MouseAdapter

Container


Listener

ContainerAdapter

MouseMotion


Listener

MouseMotion


Adapter

FocusListener

FocusAdapter

Mouselnput


Listener

Mouselnput


Adapter

KeyListener

KeyAdapter

WindowListener

WindowAdapter

在适配器类中实现了相应接口中的全部方法,只是方法的内容为空。例如,MouseListener接口的形式如下。
  public interface MouseListener extends EventListener{
  public void mouseClicked(MouseEvent e);
  public void mousePressed(MouseEvent e);
  public void mouseReleased(MouseEvent e);
  public void mouseEntered(MouseEvent e);
  public void mouseExited(MouseEvent e);}
  与其对应的适配器为MouseAdapter,形式如下:
  public abstract class MouseAdapter implements MouseListener{ }
  public void mouseClicked(MouseEvent e){ }
  public void mousePressed(MouseEvent e){ }
  public void mouseReleased(MouseEvent e){ }
  public void mouseEntered(MouseEvent e){ }
  public void mouseExited(MouseEvent e)){ }

颜色

·public void setForeground(Color c):设置前景色。
 ·public void setBackground(Color c):设置背景色。
  在这两个方法中,都需要java.awt.Color类的一个实例作参数,包括Color类中预定义的颜色常量,比如Color.red和Color.blue,或是自己创建的颜色。

文字

显示文字的方法主要有以下3种。
  ·public void drawChars(char[ ]data,int offset,int length,int x,int y):使用此图形上下文的当前字体和颜色显示字符数组data中从offset位置开始、最多length个字符。首字符的基线位于此图形上下文坐标系统的(x,y)处。
  ·public void drawString(String aString,int x,int y):在指定位置显示字符串aString。
  ·public void drawBytes(byte[ ]data,int offset,int length,int x,int y):使用此图形上下文的当前字体和颜色显示由指定的byte数组data中从offset位置开始、最多length个字符。
文字字形有字体、样式及字号3个要素。基本的样式有Font.PLAIN(正常)、Font.BOLD(粗体)及Font.ITALIC(斜体)3种,也称为字形风格。字号是字的大小,单位是磅

文字构造方法

可以使用SetFont(Font f)方法对组件中文本的字体进行设定,这个方法需要java.awt.Font类的一个实例作参数。在Java中并没有预定义的字体常量,因此需要通过给定字体名称、样式和大小自己创建Font对象。Font类的构造方法如下。
  ·Font(String name,int style,int size):根据指定名称、样式和字号,创建一个新Font对象。Font构造方法的3个参数分别是字体名称、字体的样式和字号。例如:
  Font f=new Font(“Dialog”,FontPLAIN,14);
  Font类中常用的方法如下。
  ·String getName( ):返回此Font的逻辑名称,即字体名称。
  ·int getSize( ):返回此Font的字号大小,舍入为整数。
  ·int getStyle( ):返回此Font的样式。
  ·boolean isBold( ):测试此Font对象的样式是否为BOLD。
  ·boolean isltalic( ):测试此Font对象的样式是否为ITALIC。
  ·boolean isPlain( ):测试此Font对象的样式是否为PLAIN。

Graphics类的基本功能

java.awt包中的Graphics类是所有图形处理的基础。绘图模式主要有两种,分别是正常模式和异或模式。在某个组件中绘图,一般应该为这个组件所属的子类重写paint( )方法,在该重写的方法中进行绘图。但要在JComponent子类的组件中绘图,应重写paintComponent( )方法,在该方法中进行绘图。
通常情况下,如果需要在组件上绘制图形,只需要重写JComponent的paintComponent(Graphicsg)方法。
多边形也可以画成填充的或不填充的。画多边形的方法分别是drawPolygon( )和fillPolygon( )。这两种方法都是重载的。

Graphics2D绘图

Java2D包括一个继承于Graphics类的Graphics2D类。
  (1)stroke属性
  (2)paint属性
  (3)transform属性
  (4)clip属性
  (5)composit属性