图形界面设计
- 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属性