Chapter 7 图形用户界面程序设计入门
学习目标:
浏览简单的 GUI组件
了解 Java GUI API层次结构
使用框架、面板和简单的 GUI组件创建用户界面
理解布局管理器的作用
使用 FlowLayout,GridLayout,BorderLayout,CardLayout、
BoxLayout和 null布局在容器中设置组件的布局
使用 Color类和 Font类指定颜色和字体
使用 JPanels类来创建子容器
使用 paintComponent方法在面板上画图
使用 Graphics类中的绘图方法绘制字符串、直线、矩形、椭圆、
弧形、多边形等基本图形
使用 FontMetrics类居中显示字符串
创建一个在面板上显示信息的可复用组件 MessagePanel
引言
到目前为止,我们只能使用对话框和命令窗口来进行输入输出。这些做法不仅具有局限性,
而且很不方便。例如,要读入十个数字,必须打开十个输入对话框。
从本章开始,将学习 Java图形用户界面程序设计。可以创建个性化的图形用户界面( GUI),
在同一用户界面上,既可以读取输入,又可以显示输出。
本章介绍 Java GUI程序设计基础。具体讨论
GUI组件以及它们的关系,介绍容器和布局管理器、颜色、字体、以及几何图形的绘制等。
创建 GUI对象
// Create a button with text OK
JButton jbtOK = new JButton("OK");
// Create a label with text "Enter your name,"
JLabel jlblName = new JLabel("Enter your name,");
// Create a text field with text "Type Name Here"
JTextField jtfName = new JTextField("Type Name
Here");
// Create a check box with text bold
JCheckBox jchkBold = new JCheckBox("Bold");
// Create a radio button with text red
JRadioButton jrbRed = new JRadioButton("Red");
// Create a combo box with choices red,green,and
blue
JComboBox jcboColor = new JComboBox(new
String[]{"Red",
"Green","Blue"});
Button
Label Text
field
Check
Box
Radio
Button
Combo
Box
Swing vs,AWT
为什么 GUI组件的类名都有前缀 J呢?
刚引入 Java的时候,图形组件存放在称为抽象窗口工具集
( Abstract Window Toolkit,AWT)的库中。对 Java运行的每一个平台,AWT组件通过它们各自的代理映射成平台特性的组件,
这些代理称为同位体,即需要调用操作系统提供的组件来完成工作。这样会带来组件外观在不同的操作系统上可能有所不同,而且也无法在 Java程序中调整组件的属性等很多不足。
为了让用 java创建的图形界面也能够跨平台,即在不同操作系统中保持相同的外观,从 JDK1.2版本开始引入 Swing组件,这些 Swing
组件位于 javax.swing包中,成为 JDK基础类库的一部分,大多数
Swing组件是用纯 Java语言编写而成的,除了 java.awt.Window 或
java.awt.Panel 子类的组件外,不依赖本地操作系统的 GUI,
Swing组件可以跨平台运行,独立于本地平台的 Swing组件被称为轻量级组件,而依赖于本地平台的 AWT组件被称为重量级组件,
为了区别 Swing组件类和 AWT组件,Swing GUI组件类的开头都有前缀字母 J。尽管 Java 2仍然支持 AWT组件,但是最好学习使用 Swing组件编程,因为 AWT组件终究要退出舞台。
GUI 类层次结构图
D i me n si o n
F o n t
Fo n t Me t r i c s
C o m p o n e n t
G ra p h i c s
O b j e c t C o l o r
C o n t a i n e r
Pa n e l A p p l e t
F r a me
D i a l o g
W i n d o w
J C o m p o n e n t
JA p p l e t
JF r a me
JD i a l o g
S w ing C o m po ne n ts
in t h e ja v a x,s w ing pa c ka g e
L ight we igh t
H e a vy we ight
C l a s s e s in t h e ja v a,a wt
pa c ka g e
1
L ay ou t M an ag e r
*
容器类
D i me n si o n
F o n t
Fo n t Me t r i c s
C o m p o n e n t
G ra p h i c s
O b j e c t C o l o r
C o n t a i n e r
Pa n e l A p p l e t
F r a me
D i a l o g
W i n d o w
J C o m p o n e n t
JA p p l e t
JF r a me
JD i a l o g
S w ing C o m po ne n ts
in t h e ja v a x,s w ing pa c ka g e
L ight we igh t
H e a vy we ight
C l a s s e s in t h e ja v a,a wt
pa c ka g e
1
L ay ou t M an ag e r
*
JP a n e l
容器类能用来包含其他组件
GUI类可分成三组:容器类( container)、辅助类( helper)和组件类( component)
GUI 辅助类
D i me n si o n
F o n t
Fo n t Me t r i c s
C o m p o n e n t
G ra p h i c s
O b j e c t C o l o r
C o n t a i n e r
Pa n e l A p p l e t
F r a me
D i a l o g
W i n d o w
J C o m p o n e n t
JA p p l e t
JF r a me
JD i a l o g
S w ing C o m po ne n ts
in t h e ja v a x,s w ing pa c ka g e
L ight we igh t
H e a vy we ight
C l a s s e s in t h e ja v a,a wt
pa c ka g e
1
L ay ou t M an ag e r
*
JP a n e l
辅助类不是 Component类的子类,它们用来描述 GUI组件的属性,如图形环境、颜色、字体以及大小。
Swing GUI 组件
J M e n uIt e m
J C h e c kB o x M e nu I te m
Ab st ra c t B u t t o n
J C o m p o n e n t
J M e n u
J R a di o B u tt o n M e nu I te m
J T og gle B utto n
J C h e c kB o x
J R a di o B u tt o n
J C o m bo B o x
J I n ter n a lF r a m e
J L a y e r e d P a n e
J L i s t
J M e n uB a r
J Op ti o nPa n e
J P op u pM e nu
J P r og r e s s B a r
J F il e C h oo s e r
J S c r ollB a r
J S c r ollP a n e J S e pa r a tor
J S plit P a n e
J S li de r
J T a b be dPa n e
J T a bl e J T a bl e H e a de r
J T e x t F ie l d J T e x tC om po ne nt
J T e x t Area
J T oo lB a r J T oo lT i p
J T r e e
J R oo tP a n e
J P a n e l
J P a s s wo r dFi e ld
J C ol orC h o os e r
J L a be l
J E ditor P a n e
J S pinn e r
J B utto n
AWT (Optional)
A W T E v en t
F o n t
F o n t M et r i cs
Co m p o n en t
G r ap h i cs
O b j e ct Co l o r
Ca n v as
Bu t t o n
T ext Com po nent
L ab el
L i st
Ch ec k B o x G r o u p
Ch ec k B o x
Ch o i ce
Co n t ai n er P an e l A p p l e t
F r am e
D i al o g F i l eD i al o g
W i n d o w
T ex t F i el d
T ex t A r ea
Me nu Com po nent Me n u I t em
Me n u Bar
Me n u
S cr o l l b ar
L ay ou tM an ag e r
框架 Frames
要创建一个用户界面,需要创建一个框架或
applet来存放用户界面组件。 applet后面章节会读到,本章节介绍创建框架的过程。
创建 Frames
import javax.swing.*;
public class MyFrame {
public static void main(String[] args) {
JFrame frame = new JFrame("Test Frame");
frame.setSize(400,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
}
}
向框架添加组件
// Add a button into the frame
frame.getContentPane().add(
new JButton("OK"));
MyFrameWithComponents
Title bar
Content pane
注释
JFrame类中的 getContentPane()可以返回框架的内容窗格,其是 java.awt.Container的实例,GUI组件就放置在内容窗格中。
内容窗格是怎么创建的呢? getContentPane()
并没有创建它,它是伴随着 JFrame对象的创建而创建的。
与 Container.add(Component comp)类似,要想从容器中删除组件,可以调用
remove(Component comp)
框架居中默认情况下,框架在屏幕的左上角显示。屏幕左上角的坐标是( 0,0)。 x轴坐标向右递增,y轴坐标向下递增。
s c r e e n H e i gh t
s c r e e n W i dt h
ge t H e i gh t ( )
ge t W i dt h ( )
( x,y )
F r a m e
S c r e e n
( 0,0)
CenterFrame
要把框架放置在屏幕上居中的位置,需要知道屏幕和框架的宽和高,以便确定框架左上角的坐标。屏幕的宽和高可以使用 java.awt.Toolkit类得到:
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
int screenWidth=screenSize.width;
int screenHeight=screenSize,height;
布局管理器
在许多其他窗口系统中,通过使用硬编码( hard-code)的像素尺寸来安排用户界面组件。例如,在窗口中把一个按钮放在位置( 10,10)处。使用硬编码的像素尺寸,用户界面可能在一个系统中看上去很好,但不适合另一个系统。 Java
的布局管理器提供了一层抽象,自动把用户界面映射到所有的窗口系统。
Java的 GUI组件在容器中放置的位置由容器的布局管理器来安排。布局管理器根据自己的规则和属性设置来摆放组件,
例如,FlowLayout布局管理器按行从左向右依次放置组件,
一行填满再开始新的一行。
布局管理器是使用布局管理器类创建的,每一个布局管理器类都实现了 LayoutManager接口。容器使用
setLayout(LayoutManager layout)方法在容器中设置布局管理器。如:
LayoutManager layout=new FlowLayout;
container.setLayout(layout);
FlowLayout布局管理器
FlowLayout是最简单的布局管理器。按照添加的顺序,由左到右将组件排列在容器中,放满一行时,就开始新的一行。
public FlowLayout(int align,int hGap,int vGap)
按照指定的对齐方式 align( FlowLayout.RIGHT、
FlowLayout.CENTER,FlowLayout.LEFT)、水平间距 hGap
和垂直间距 vGap构造一个新的 FlowLayout布局管理器。
public FlowLayout(int alignment)
按照指定的对齐方式 alignment构造一个新的 FlowLayout布局管理器,默认的间距都是 5个像素。
public FlowLayout()
构造一个新的 FlowLayout布局管理器,默认的对齐方式是居中,默认的间距都是 5个像素。
Example 7.4 测试 FlowLayout管理器问题:编写程序,
使用 FlowLayout布局管理器,在一个框架的内容窗格中添加 10个按钮
ShowFlowLayout
Example 7.4 测试 FlowLayout管理器(续)
本例使用与前一节不同的风格创建了一个程序,前一节的程序利用 JFrame类创建框架,本例扩展
JFrame类创建了名为 showFlowLayout的类,其构造方法创建组件,并将它们放置在框架中,而在 main
方法创建 showFlowLayout实例。这是创建 GUI应用程序较好的方法,理由有:
创建一个 GUI应用程序就是要创建一个框架,所以扩展 JFrame类来定义一个框架是很自然的;
如果需要的话,这个新类可以重复使用,使用一致的风格可以使程序容易阅读。
GridLayout布局管理器
根据构造方法定义的行数和列数,布局管理器 GridLayout以网格
(矩阵)的形式排列组件。组件按照添加的顺序从左到右排列,从第一行开始,接着第二行,如此下去。
public GridLayout(int rows,int columns)
构造指定行数和列数的 GridLayout对象,组件的水平和垂直间距为 0
public GridLayout(int rows,int columns,int hGap,
int vGap)
构造指定行数、列数、组件的间距值的 GridLayout对象
public GridLayout()
构造一个新的 GridLayout对象,它只有一行。
注意:可以指定网络的行数和列数,基本规则如下:
行数和列数可以为零,但不能全为零,如果一个为零另一个不为零,那么不为零的维数已经固定,为零的维数由布局管理器动态决定。例如,指定网络的行数为 0列数为 3,放置 10个组件,如何放?
如果行数和列数都不为零,那么行数是固定的,布局管理器动态地决定列数。
Example 7.5测试 GridLayout布局管理器问题:编写一个程序,使用布局管理器
GridLayout在框架的内容窗格中添加 10个按钮
ShowGridLayout
BorderLayout布局管理器
布局管理器 BorderLayout将窗口分成五部分:东区、南区、
西区、北区和中央。
BorderLayout的构造方法:
public BorderLayout(int hGap,int vGap)
根据组件之间指定的水平和垂直间距构造布局管理器
public BorderLayout()
组件根据它们最合适的尺寸和在容器中的位置来放。
南、北组件可以水平扩展,东、西组件能垂直拉伸,
中央组件既可以水平也可以竖直扩展以填满空间
add(component,index)
该方法可以将组件添加到 BorderLayout布局管理器中,其中 index是一个常量,取值为 BorderLayout.EAST,BorderLayout.SOUTH,BorderLayout.WEST、
BorderLayout.NORTH或 BorderLayout.CENTER。
Example 7.6 测试 BorderLayout布局问题:编写程序,使用布局管理器 BorderLayout在框架的内容窗格中添加 5个标有 East,South,West、
North和 Center的按钮。
ShowBorderLayout
CardLayout布局管理器
CardLayout布局管理器将组件像卡片一样放置在容器中,每次仅有一张卡片是可见的,容器的作用就像一叠卡片。这些卡片的顺序是由容器中组件对象的内部顺序决定的。
要将组件添加到容器中,可以使用 Container类接口中定义的
add(Component c,String name)方法,其中 name给定组件在容器中的明确标识,如,1”。
Co m p o n e n t s i n t h e
co n t ai n e r o f
Car d L ay o u t
h G ap
v G ap
Co m p o n e n t 1
Co m p o n e n t 2
Co m p o n e n t 3
Co m p o n e n t 4
CardLayout定义了一组方法,允许应用程序以顺序翻动卡片或直接指定卡片的方式来访问组件。
ja v a,a w t.C a r d L a y o u t
- h g ap,i n t
- v g ap,i n t
+Car d L a y o u t ( )
+Car d L a y o u t ( h g ap,i n t,v g a p,i n t )
+f i r s t ( p ar e n t,Co n t ai n e r ),v o i d
+l ast( p ar e n t,Co n t ai n e r ),v o i d
+ne x t ( p ar e n t,Co n t a i n e r ),v o i d
+pr e v i o u s ( p ar e n t,Co n t ai n e r ),v o i d
+s h o w ( p ar e n t,Co n t a i n e r,n a m e,S t r i n g ),v o i d
ja v a,a wt,La y o u tM a n a g e r
H o r i z o n t al g ap,
V e r t i cal g ap,
Cr e at e s a d e f au l t Car d L a y o u t m an ag e r w i t h n o g ap s,
Cr e at e s a d e f au l t Car d L a y o u t m an ag e r w i t h t h e s p e ci f i e d g ap s,
F l i p s t o t h e f i r s t car d o f t h e co n t a i n e r,
F l i p s t o t h e l ast c ar d o f t h e co n t ai n e r,
F l i p s t o t h e n e x t c ar d o f t h e s p e ci f i e d co n t ai n e r,I f t h e c u r r e n t l y v i s i b l e
car d i s t h e l ast o n e,t h i s m e t h o d f l i p s t o t h e f i r s t c ar d i n t h e l ay o u t,
F l i p s t o t h e n e x t c ar d o f t h e s p e ci f i e d co n t ai n e r,I f t h e c u r r e n t l y v i s i b l e
car d i s t h e l ast o n e,t h i s m e t h o d f l i p s t o t h e f i r s t c ar d i n t h e l ay o u t,
F l i p s t o t h e co m p o n e n t t h at w as ad d e d t o t h i s l ay o u t w i t h t h e s p e ci f i e d
n am e,
Example 7.10使用 CardLayout
ShowCardLayout
要求:在一个框架中创建两个面板。第一个面板使用
CardLayout放置 6个显示图像的标签。第二个面板使用
FlowLayout放置 4个按钮 First,Next、
Previous,Last,以及一个标签为 Image的组合框。
null布局
如果你使用过 VB之类基于 Windows的快速应用开发工具,就会体会到使用 VB创建用户界面比使用 Java容易得多,主要原因是在 VB中组件是按绝对位置和大小放置的,而在 Java中,
组件是根据容器中的各种布局管理器来放置的。如果应用程序是在同一个平台上创建并发布,绝对位置和大小是很好使用,
但如果开发平台与应用平台不同时,那么可能在开发平台上看上去很好看的界面,在应用平台上效果并不理想。 Java提供的布局管理器就是为了解决这一问题,它可以不依赖于系统字体、
屏幕分辨率和平台差异在容器中摆放组件。
为了方便,Java也支持绝对布局,可以在固定位置上放置组件。用户可以调用下列方法声明不使用布局管理器:
container.setLayout(null);
然后在容器中添加组件,container.add(Component c)
组件 c调用 setBounds(int x,int y,int width,int
height) 方法设置该组件在容器中的位置和本身大小。
Example 7.11,使用 null布局要求:使用 null布局创建右图所示的界面。
ShowNoLayout
BoxLayout布局管理器
Javax.swing.BoxLayout是一个 Swing布局管理器,它在一行或一列中摆放组件。可用下列构造方法创建对象,
public BoxlayLayout(Container target,int axis)
参数 target指明应用 BoxLayout布局的目标容器,参数
axis取值为 BoxLayout.X_AXIS 或 BoxLayout.Y_AXIS,
用来指出组件是水平放置还是竖起放置。
创建布局管理器对象后,仍然需要容器调用
setLayout(LayoutManager)方法来设置布局管理器。
BoxLayout可以在任何容器上使用,但是在 Box类(是一个 BoxLayout的容器)上使用更简单。
Box 类
可以使用两个静态方法之一创建 Box容器,
Box box1 = Box.createHorizontalBox();
Box box2 = Box.createVerticalBox();
与 FlowLayout容器一样,可以用 add方法向 Box容器添加组件,
在水平 Box容器中组件是从左向右放置的,在垂直 Box中是自上而下放置的。
BoxLayout布局中组件之间没有距离,但可以使用装填物
( filler)来分离组件。装填物是一种看不见的组件,可分为三种,
支柱、刚性块和胶条
支柱( strut)只是简单地在组件之间添加一些空间。
Box类静态方法 createHorizontalStrut(int)创建水平支柱
Box类静态方法 createVerticalStrut(int)创建垂直支柱
刚性块( rigid area)是一个二维区域。
Box静态方法 createRigidArea(dimension)创建刚性块
胶条( glue)尽可能远地分离组件。比如,在水平 Box中向两个组件之间添加一个胶条,会使两个组件分处在容器的左右两端。
Box静态方法 createGlue()可创建一个胶条
Example 7.12 使用 BoxLayout 布局管理器
Problem,使用 Box容器创建右图所示的界面
ShowBoxLayout
布局管理器的属性
布局管理器的属性可以动态地改变。
FlowLayout具有属性 alignment,hGap和
vGap,可以使用 setAlignment,setHgap和
setVgap方法来指定对齐方式、间距。
GridLayout具有属性 rows,columns,hGap
和 vGap,可以使用 setRows,setColumns、
setVgap方法来指定行数等属性。
BorderLayout具有属性 hGap和 vGap,可以使用 setHgap和 setVgap方法来指定水平垂直间距
validate和 doLayout方法
每一个时刻,一个容器只能有一个布局管理器。可以使用 setLayout(aNewLayout)
方法改变容器的布局管理器,然后使用
validate()方法强迫容器根据新的布局管理器重新摆放其中的组件。
如果使用相同的布局管理器但是改变了它的属性,需要使用 dolayout()方法强迫容器根据布局管理器的新属性对组件重新放置。
颜色类 Color
可以使用 java.awt.Color类为 GUI组件设置颜色。颜色由红、
绿、蓝三原色构成,每种原色的强度都用一个 byte值表示,
从 0(最暗)到 255(最亮)。这就是通常所说的 RGB模式
可以用下述构造方法创建 Color对象
Color c = new Color(r,g,b);
其中 r,g,b指定一个颜色的红、绿、蓝成分
可以使用定义在 java.awt.Component类中的
setBackground(Color c)和 setForeground(Color c)方法来设置组件的背景和前景色。
java.awt.Color中将 13种标准颜色( black,blue,cyan、
darkGray,gray,green,lightGray,magenta,orange、
pink,red,white和 yellow)定义为常量,并可以选用它们。
颜色类 Color(续)
java.awt.Color中将 13种标准颜色( black,blue、
cyan,darkGray,gray,green,lightGray、
magenta,orange,pink,red,white和 yellow)定义为常量,并可以选用它们。
不符合 Java命名习惯字体类 Font
可以使用 java.awt.Font类创建字体对象,并使用
Component类中的 setFont方法设置组件的字体。
Font的构造方法:
public Font(String name,int style,int size);
name指的是字体名,如,SansSerif,Dialog” 等。 style
包括 Font.PLAIN(0),Font.BOLD(1),Font.ITALIC(2)、
Font.BOLD+Font.ITALIC(3),size指字号大小。
找到所有可用字体可用下面方法获得系统支持的所有字体:
GraphicsEnvironment e =
GraphicsEnvironment.getLocalGraph
icsEnvironment();
String[] fontnames =
e.getAvailableFontFamilyNames();
for (int i = 0; i <
fontnames.length; i++)
System.out.println(fontnames[i]);
使用面板作子容器
假设要在框架中放置 10个按钮和 1个文本域,按钮以网格形式放置,文本域单独占一行。如果将所有这些组件放在一个单容器中,很难达到要求的视觉效果。
使用 Java用户图形界面程序设计,可以将窗口分成几个面板,
面板是分组放置用户界面组件的子容器。可将按钮和文本域分别放在两个面板中,然后将这两个面板放置在框架中。
面板的 swing版本是 JPanel。可以使用 new JPanel()创建一个带默认布局管理器 FlowLayout的面板,也可以使用 new
JPanel(LayoutManager)创建一个指定布局管理器的面板。使用 add(Component)方法可以给面板添加一个组件。
面板可以放置到框架的内容窗格或另一个面板中。
Example 7.7 测试面板问题:编写一个程序,使用面板组织组件,创建一个微波炉的用户界面
TestPanels
A butt o n
A tex tf ie ld
12
butt ons
f r am e
p2
p1
在面板上绘制图形
面板是不可见的,可以用作组织组件的小容器,以达到要求的布局效果。 JPanel的另一个重要用途是绘制图形。
要在面板上画图,需要创建一个由 JPanel扩展的新类,
并且重写 paintComponent方法告知面板如何画图。虽然可以在框架或 applet中使用 paint方法直接画图,但是,
最好使用 JPanel绘制字符串和图形图像,用这种方法画图不会影响其他组件。
paintComponent方法定义在 JComponent中,它的方法头标志如下:
protected void paintComponent(Graphics g)
Graphics对象是由 Java虚拟机为每个 GUI组件自动创建的。这个对象控制信息的绘制方式,可以使用定义在 Graphics类中的多种画法绘制字符串和几何图形。如:
public void drawString(String str,int
x,int y)
Drawing on Panels,cont.
public class DrawMessage extends JPanel {
/** Main method */
public static void main(String[] args) {
JFrame frame = new JFrame("DrawMessage");
frame.getContentPane().add(new DrawMessage());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setVisible(true);
}
/** Paint the message */
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Welcome to Java!",40,40);
}
}
(40,40)
Java 坐标系统
( 0,0 ) X A x i s
Y A x i s
( x,y )
x
y
Ja v a C o o r d i n at e
S y ste m
X A x i s
T r ad i t i o n al
Co o r d i n at e
S y ste m
( 0,0 )
Y A x i s
所有的画图方法都有指定绘图位置的参数。 Java中所有的度量都以像素为单位,每个组件都有自己的坐标系统,原点( 0,0)
在左上角,x坐标向右增加,y坐标向下增加。这与传统的坐标系统不同。
绘制几何图形
绘制直线
绘制矩形
绘制椭圆
绘制圆弧
绘制多边形绘制直线
drawLine(int x1,int y1,int x2,int y2);
(0,0) (g e tW idth (),0 )
(g e tW idth (),g e tH e ig ht()) (0,g e tH e ig ht())
(x 1,y 1)
(x 2,y 2)
绘制矩形
drawRect(int x,int y,int w,int h);
fillRect(int x,int y,int w,int h);
( x,y )
w
h
( x,y )
w
h
绘制圆角矩形
drawRoundRect(int x,int y,int w,int h,int aw,int ah);
fillRoundRect(int x,int y,int w,int h,int aw,int ah);
(x,y )
w
h
a h/2
a w /2
DrawRectangles
绘制椭圆
drawOval(int x,int y,int w,int h);
fillOval(int x,int y,int w,int h);
( x,y )
w
h
DrawOvals
绘制弧形
drawArc(int x,int y,int w,int h,int angle1,int
angle2);
fillArc(int x,int y,int w,int h,int angle1,int
angle2);
Angles are in
degree
Drawing Arcs Example
DrawArcs
绘制多边形
int[] x = {40,70,60,45,20};
int[] y = {20,40,80,45,60};
g.drawPolygon(x,y,x.length);
( x [ 0 ],y [ 0 ] )
( x [ 1 ],y [ 1 ] )
( x [ 2 ],y [ 2 ] )
( x [ 3 ],y [ 3 ] )
( x [ 4 ],y [ 4 ] )
g.drawPolyline(x,y,
x.length);
( x [ 0 ],y [ 0 ] )
( x [ 1 ],y [ 1 ] )
( x [ 2 ],y [ 2 ] )
( x [ 3 ],y [ 3 ] )
( x [ 4 ],y [ 4 ] )
使用 Polygon类绘制多边形例:
Polygon polygon = new Polygon();
polygon.addPoint(40,59);
polygon.addPoint(40,100);
polygon.addPoint(10,100);
g.drawPolygon(polygon);
下面的构造方法用于创建 Polygon对象:
public Polygon()
public Polygon(int[] xpoints,int[] ypoints,int npoints)
要在多边形上追加一个点,使用 addPoint(int x,int y)方法
要绘制或填充一个多边形,可用下列方法:
drawPolygon(Polygon polygon);
fillPolygon(Polygon polygon);
Drawing Polygons Example
DrawPolygon
利用 FontMetrics 类居中显示可以在一个面板的任何指定位置显示一个字符串,但是可以在中央显示它吗?要想做到这一点,需要使用 FontMetrics类,对特定字体的字符串测量出精确的宽度和高度。
FontMetrics是一个抽象类,要得到给定字体的 FontMetrics对象,可以使用定义在 Graphics类中的 getFontMetrics方法:
public FontMetrics getFontMetrics(Font font)
public int getAscent()
public int getDescent()
public int getLeading()
getAscent()
getLeading()
getDescent()
getLeading()
public int getHeight()
public int stringWidth(String str)
可以使用 FontMetrics类中的下列实例方法得到字体属性及字符串的宽度
W elc ome to Jav a
str i n g W i d t h
str i n g A sce n t
g e t H e i g h t ( )
g e t W i d t h ( )
p a n e l
CenterMessage
实例学习 I:信息面板类 MessagePanel
M e ssa g e Pa n e l
- x C o o rd i n a t e,i n t
- y C o o rd i n a t e,i n t
- c e n t e re d,b o o l e a n
- me ssa g e,St ri n g
- i n t e rv a l,i n t
+ M e ssa g e Pa n e l ()
+ M e ssa g e Pa n e l (me ssa g e,St ri n g )
+ mo v e L e ft (),v o i d
+ mo v e R i g h t (),v o i d
+ mo v e Up (),v o i d
+ mo v e Do w n (),v o i d
j av ax,s w i n g,JP an el
- c h a r toke n
+ g e t T ok e n
+ s e tT ok e n
+ pa intC o m po n e t
+ m o u s e C li c ke d
T h e g e t a n d se t me t h o d s fo r t h e se d a t a
fi e l d s a re p ro v i d e d i n t h e c l a ss,b u t
o mi t t e d i n t h e U M L d i a g ra m
T h e x - C o o rd i n a t e fo r t h e me ssa g e (d e fa u l t 2 0 ),
T h e y - C o o rd i n a t e fo r t h e me ssa g e (d e fa u l t 2 0 ),
Sp e c i fi e s w h e t h e r t h e me ssa g e i s d i s p l a y e d c e n t e re d,
T h e me ssa g e t o b e d i s p l a y e d,
T h e i n t e rv a l t o mo v e t h e me ssa g e i n t h e p a n e l,
C o n st r u c t s a d e fa u l t me ssa g e p a n e l,
C o n st r u c t s a me ssa g e p a n e l w i t h a s p e c i fi e d st ri n g,
M o v e s t h e me ssa g e t o t h e l e ft,
M o v e s t h e me ssa g e t o t h e ri g h t,
M o v e s t h e me ssa g e u p,
M o v e s t h e me ssa g e d o w n,
MessagePanel
本实例开发一个在面板中显示信息有类。
这个类允许用户设置信息的位置、居中放置、用指定间距移动信息。
TestMessagePanel