java 软件设计基础

102

Click here to load reader

Upload: lei

Post on 10-Jan-2016

115 views

Category:

Documents


1 download

DESCRIPTION

Java 软件设计基础. GUI 设计进阶. 1. 布局设计. 布局概述 Java 的 GUI 组件在容器中放置,它们的位置由容器的布局管理器来安排。后台工作的布局管理器能够将组件放置在正确的位置。 java.awt FlowLayout BorderLayout CardLayout GridLayout GridBagLayout java.swing BoxLayout ScrollPanelLayout ViewportLayout OverLayout. FlowLayout 布局策略 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Java 软件设计基础

Java软件设计基础

GUIGUI 设计进阶设计进阶

Page 2: Java 软件设计基础

School of Computer Science and Technology

1. 布局设计

• 布局概述布局概述–Java的 GUI 组件在容器中放置,它们的位置由容器的布局管

理器来安排。后台工作的布局管理器能够将组件放置在正确的位置。–java.awt

•FlowLayout

•BorderLayout

•CardLayout

•GridLayout

•GridBagLayout

–java.swing•BoxLayout

•ScrollPanelLayout

•ViewportLayout

•OverLayout

Page 3: Java 软件设计基础

School of Computer Science and Technology

• FlowLayoutFlowLayout–布局策略

•将容器的组件按照加入的先后顺序从左至右依次排列,一行排满后就转到下一行继续从左至右顺序排列,每一行中的组件都居中排列,组件间默认的水平和垂直间隙是五个像素。

•FlowLayout是 JPanel与 Applet 默认的布局管理策略。–构造方法FlowLayout()FlowLayout() 创建一个创建一个 FlowLayoutFlowLayout 居中布局,组件间水平和垂直间居中布局,组件间水平和垂直间

隙均为隙均为 55 个像素个像素

FlowLayout(int align)FlowLayout(int align) 创建一个创建一个 FlowLayoutFlowLayout 布局,对齐方式为布局,对齐方式为 alignalign ,组,组件间水平和垂直间隙均为件间水平和垂直间隙均为 55 个像素个像素

FlowLayout(int align, int FlowLayout(int align, int h, int v)h, int v)

创建一个创建一个 FlowLayoutFlowLayout 布局,对齐方式为布局,对齐方式为 alignalign ,组,组件间水平和垂直间隙分别为件间水平和垂直间隙分别为 hh 和和 vv 个像素个像素

Page 4: Java 软件设计基础

School of Computer Science and Technology

–示例import java.awt.*;import javax.swing.*;public class Flows extends J Frame{

private J Button but1,but2,but3;public Flows(){

super("FlowLayout演示程序");FlowLayout layout = new FlowLayout(FlowLayout.CENTER);Container c = getContentPane();c.setLayout(layout);layout.setHgap(8);but1= new J Button("left");but2= new J Button("center");but3= new J Button("right");c.add(but1); c.add(but2); c.add(but3);setSize(300,100);show();

}public static void main(String args[]){

Flows app = new Flows();}

}

Page 5: Java 软件设计基础

School of Computer Science and Technology

• 两种程序格式的比较两种程序格式的比较class FrameName extends J frame{

public FrameName(){框架属性、组件设置;

}public static void main(String args[]){

FrameName f=new FrameName();}

}

class AppName{public static void main(String args[]){

Frame f=new Frame();定义组件;f.add(组件对象);……

}}

创建一个 GUI应用程序就是要创建一个框架,用扩展 JFrame类来定义一个框架是很自然的;对框架中组件和函数的修改增减可以很方便的在框架的构造函数中完成;这样的方式集成性和封装性更好,也易于重复使用,如为其创建多个实例来获得多个框架。

Page 6: Java 软件设计基础

School of Computer Science and Technology

• GridLayoutGridLayout–布局策略

•在一个二维网格中布置组件。将容器划分为若干行若干列的网格区域,每个网格的大小相等,组件就位于这些划分出来的小格中,一个网格可以放置一个组件。组件可被依次的放在第一行第一列、第一行第二列……的顺序进行。

•通过在一个网格中放置容器,可以实现嵌套。•GridLayout 也称为网格布局管理器,该布局比较灵活,划分多

少网格由程序自由控制,组件定位也比较精确。–构造方法GridLayout()GridLayout() 创建一个创建一个 GridLayoutGridLayout 布局布局

GridLayout(int r, int c)GridLayout(int r, int c) 创建一个创建一个 rr 行行 cc 列的列的 GridLayoutGridLayout 布局布局

GridLayout(int r, int c, int GridLayout(int r, int c, int h, int v)h, int v)

创建一个创建一个 rr 行行 cc 列的列的 GridLayoutGridLayout 布局布局 ,, 组件间水平组件间水平和垂直间隙分别为和垂直间隙分别为 hh 和和 vv 个像素个像素

Page 7: Java 软件设计基础

School of Computer Science and Technology

–实例import java.awt.*;import java.awt.event.*;import javax.swing.*;public class GridsExam extends J Frame{

private J Button b[ ];private String names[ ] = {"1-1","1-2","1-3","2-1","2-2","2-3"};private Container c;private GridLayout layout;public GridsExam(){

super("GridLayout");layout = new GridLayout(2,3,14,16);c = getContentPane();c.setLayout(layout); c.setBackground(Color.pink);b = new J Button[names.length];for(int i=0;i<names.length;i++){

b[i] = new J Button(names[i]); c.add(b[i]);}setSize(350,160); show();

}public static void main(String args[]){

GridsExam gg = new GridsExam();gg.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){System.exit(0);}});

}}

Page 8: Java 软件设计基础

School of Computer Science and Technology

• BorderLayoutBorderLayout–布局策略

•BorderLayout 也 称 为 边 界 布 局 管 理 器 , 是Window、 Frame和Dialog 默认的布局管理策略。

•将窗口分为 North/East/South/West/Center 五个区域,中间的区域最大。南北组件可以水平扩展,东西组件可以垂直拉伸;每加入一个组件都应该指明添加到哪个区域,若不指明则默认添加至Center 区域。

–构造方法

–一般方法

BorderLayout()BorderLayout() 创建一个创建一个 BorderLayoutBorderLayout

BorderLayout(int h, BorderLayout(int h, int v)int v)

创建一个创建一个 BorderLayoutBorderLayout 布局,组件间水平和垂直间隙分别布局,组件间水平和垂直间隙分别为为 hh 和和 vv 个像素个像素

add(Component comp, Object add(Component comp, Object con)con)

加入组件加入组件 compcomp ,, concon 指明组件被加入的位置指明组件被加入的位置

Page 9: Java 软件设计基础

School of Computer Science and Technology

–实例import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Borders extends J Frame implements ActionListener{

private J Button b[ ];private String names[ ] = {“NORTH”,”SOUTH”,”WEST”,”EAST”,”CENTER”};private BorderLayout layout;public Borders(){

super(“BorderLayout演示程序”);layout = new BorderLayout(5,5);Container c = getContentPane();c.setLayout(layout);b = new J Button[names.length];for(int i=0;i<names.length;i++){

b[i] = new J Button(names[i]);b[i].addActionListener(this);

}c.add(b[0],BorderLayout.NORTH);c.add(b[1],BorderLayout.SOUTH);c.add(b[2],BorderLayout.WEST);c.add(b[3],BorderLayout.EAST);c.add(b[4],BorderLayout.CENTER);setSize(400,300);show();

}

Page 10: Java 软件设计基础

School of Computer Science and Technology

–续public void actionPerformed(ActionEvent e){

for(int i=0;i<b.length;i++){if(e.getSource()==b[i])

b[i].setVisible(false);else

b[i].setVisible(true);}layout.layoutContainer(getContentPane());

}public static void main(String args[]){

Borders bb = new Borders();bb.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){System.exit(0);

}});

}}

Page 11: Java 软件设计基础

School of Computer Science and Technology

Page 12: Java 软件设计基础

School of Computer Science and Technology

• CardLayoutCardLayout–布局策略

•CardLayout 也称为卡式布局管理器。可实现多个组件在同一容器区域内重叠放置、交替显示。通过用户的操作可将组件一个接一个显示出来,即容纳多个组件的同时只能从这些组件中选出一个来显示,这个被显示的组件将占据所有的容器空间。

–构造方法

–一般方法

CardLayout()CardLayout() 创建一个创建一个 CardLayoutCardLayout

CardLayout(int h, CardLayout(int h, int v)int v)

创建创建 CardLayoutCardLayout 布局,组件间水平和垂直间隙分别为布局,组件间水平和垂直间隙分别为 hh 和和 vv 个个像素像素

first(Container c)first(Container c) 显示显示 ContainerContainer 中的第一个对象中的第一个对象

last(Container clast(Container c 显示显示 ContainerContainer 中的最后一个对象中的最后一个对象

previous(Container c)previous(Container c) 显示显示 ContainerContainer 中的上一个对象中的上一个对象

next(Container c)next(Container c) 显示显示 ContainerContainer 中的下一个对象中的下一个对象

add(String t, Component add(String t, Component c)c)

将组件将组件 cc 加到容器中并指定与加到容器中并指定与 cc 对应的选项卡文本提示为对应的选项卡文本提示为tt

Page 13: Java 软件设计基础

School of Computer Science and Technology

–实例import java.awt.*;import java.awt.event.*;import javax.swing.*;public class CardsExam extends J Frame{

private J Button but1,but2,but3;private Icon icon1,icon2,icon3;private CardLayout layout;private Container c;public CardsExam(){

super("CardLayout演示程序");layout = new CardLayout(10,10);c = getContentPane();icon1 = new ImageIcon("1.jpg");icon2 = new ImageIcon("2.jpg");icon3 = new ImageIcon("3.jpg");but1 = new J Button("Button1",icon1);c.add(but1);but1.addActionListener(new listener());but2 = new J Button("Button2",icon2);c.add(but2);but2.addActionListener(new listener());but3 = new J Button("Button3",icon3);c.add(but3);but3.addActionListener(new listener());c.setLayout(layout);setSize(300,150); show();

}

Page 14: Java 软件设计基础

School of Computer Science and Technology

–续

private class listener implements ActionListener{public void actionPerformed(ActionEvent e){

if(e.getSource()==but1| | e.getSource()==but2| | e.getSource()==but3)layout.next(c);

}}public static void main(String args[]){

ardsExam cc = new CardsExam();}

}

Page 15: Java 软件设计基础

School of Computer Science and Technology

• GridBagLayoutGridBagLayout–布局策略

•采用网格的形式来布置组件,允许指定的组件跨多行或多列,同时允许组件部分重叠。

•组件的位置和大小由 GridBagConstraints 类的对象实例决定。 GridBagConstraints 类规范组件使用 GridBagLayout 布局管理器的限制条件。

•GridLayout 也称为网格包布局管理器,是 Java 提供的最灵活、最复杂的布局管理器之一。

–构造方法GridBagLayout gridBag = new GridBagLayout();GridBagConstraints con = new GridBagConstraints();

Page 16: Java 软件设计基础

School of Computer Science and Technology

–GridBagLayout 的方法

–GridBagConstraints 的属性

GridBagLayout()GridBagLayout() 创建一个创建一个 GridBagLayoutGridBagLayout 布局布局

setConstrains(Component setConstrains(Component comp, GridBagConstraints comp, GridBagConstraints cons)cons)

设置网格包约束条件,设置网格包约束条件, compcomp 是被加入的组件,并用是被加入的组件,并用 conscons 指指定为定为 GridBagConstraintsGridBagConstraints 类的一个实例类的一个实例

add(Component comp, Object add(Component comp, Object cons)cons)

添加组件,并用添加组件,并用 conscons 指定指定 GridBagConstraintsGridBagConstraints 类的一类的一个实例个实例

fillfill 当组件比所在网格小时的填充方式当组件比所在网格小时的填充方式 NONE, HORIZONTAL, VERTICAL, BOTHNONE, HORIZONTAL, VERTICAL, BOTH

anchoranchor 当组件小于显示区域网格时决定组件当组件小于显示区域网格时决定组件放置的位置放置的位置

CENTER(CENTER( 默 认 值默 认 值 ), NORTH, NORTHEAST, ), NORTH, NORTHEAST, EAST, SOUTH, SOUTHEAST, SOUTHWEST, EAST, SOUTH, SOUTHEAST, SOUTHWEST, WEST, NORTHWESTWEST, NORTHWEST

insetsinsets 填充组件和网格边缘间的部分,负值填充组件和网格边缘间的部分,负值导致组件延伸到网格单元的外边导致组件延伸到网格单元的外边

默认为默认为 insets(0,0,0,0)insets(0,0,0,0) ,四个参数分别代表上,四个参数分别代表上下左右下左右

gridxgridx

gridygridy指定组件的左上角所在的行和列指定组件的左上角所在的行和列 第一行或第一列均用第一行或第一列均用 00 表示表示

gridwidtgridwidthh

girdheiggirdheightht

指定组件显示区域所占行数和列数指定组件显示区域所占行数和列数 整数,值为整数,值为 RemainderRemainder 表示组件为当前行或列的最表示组件为当前行或列的最后一个组件,后一个组件, RelativeRelative 则表示紧挨着当前行或列则表示紧挨着当前行或列组件后组件后

weightxweightx

weightyweighty指定分配给组件的额外水平空间和额指定分配给组件的额外水平空间和额外垂直空间外垂直空间

浮点数浮点数

Page 17: Java 软件设计基础

School of Computer Science and Technology

–实例import java.awt.*;import java.awt.event.*;public class GridBags extends J Frame{

public static void main(String args[]){Frame f = new Frame("GridBagLayout");GridBagLayout g1 = new GridBagLayout();GridBagConstraints con = new GridBagConstraints();con.fill = GridBagConstraints.HORIZONTAL;f.setLayout(g1);Button but1 = new Button("Data input");Button but2 = new Button("Data modified");Button but3 = new Button("Data query");Button but4 = new Button("Data print");Button but5 = new Button("Data delete");g1.setConstraints(but1,con);con.weightx = 1.2;f.add(but1);g1.setConstraints(but2,con);f.add(but2);g1.setConstraints(but3,con);f.add(but3);con.gridwidth = GridBagConstraints.REMAINDER;g1.setConstraints(but4,con);f.add(but4);g1.setConstraints(but5,con);f.add(but5);f.setSize(250,100);f.setBackground(Color.cyan);f.setVisible(true);

}}

Page 18: Java 软件设计基础

School of Computer Science and Technology

• BoxLayoutBoxLayout–布局策略

•又称为盒式布局管理器,在 java.swing.border 包中。•有垂直和水平两种排列方式,组件加入的先后顺序为从左 ( 上 ) 到

右 ( 下 ) ,容器两端是剩余的空间。在策划程序布局时,也可以通过盒式布局的嵌套达到目的。

•java.swing 中提供的 Box 类是 Container 类的子类,据此创建的容器称为盒式容器,默认布局即为 BoxLayout 且无法更改。

–构造方法BoxLayout(Container con, int BoxLayout(Container con, int axis)axis)

创建创建 BoxLayoutBoxLayout 布局,参数布局,参数 axisaxis 决定该布局是行决定该布局是行型还是列型布局,其有效值是型还是列型布局,其有效值是 BoxLayout.X-AXISBoxLayout.X-AXIS和和 BoxLayout.Y-AXISBoxLayout.Y-AXIS

Page 19: Java 软件设计基础

School of Computer Science and Technology

–一般方法

getLayoutAlignmentX(ContaingetLayoutAlignmentX(Container con)er con)

获得容器沿获得容器沿 XX 轴的对齐方式:行排列轴的对齐方式:行排列

getLayoutAlignmentY(ContaingetLayoutAlignmentY(Container con)er con)

获得容器沿获得容器沿 YY 轴的对齐方式:行排列轴的对齐方式:行排列

setLayoutAlignmentX(ContainsetLayoutAlignmentX(Container con)er con)

设置容器沿设置容器沿 XX 轴的对齐方式:行排列轴的对齐方式:行排列

setLayoutAlignmentY(ContainsetLayoutAlignmentY(Container con)er con)

设置容器沿设置容器沿 YY 轴的对齐方式:行排列轴的对齐方式:行排列

LayoutContainer(Container LayoutContainer(Container con)con)

设置设置 concon 窗口的布局方式为窗口的布局方式为 BoxLayoutBoxLayout 布局布局

Box.createHorizontalBox()Box.createHorizontalBox() 构建一个行型盒式布局的构建一个行型盒式布局的 BoxBox 容器组件容器组件

Box.createverticalBox()Box.createverticalBox() 构建一个列型盒式布局的构建一个列型盒式布局的 BoxBox 容器组件容器组件

Box.createHorizontalStruct(int Box.createHorizontalStruct(int width)width)

构建一个不可见的宽度为构建一个不可见的宽度为 widthwidth 的水平的水平 StructStruct 类类型支撑对象来控制组件之间的距离型支撑对象来控制组件之间的距离

Box.createverticalStruct(int Box.createverticalStruct(int height)height)

构建一个不可见的宽度为构建一个不可见的宽度为 widthwidth 的水平的水平 StructStruct 类类型支撑对象来控制组件之间的距离型支撑对象来控制组件之间的距离

Box.createHorizontalGlue()Box.createHorizontalGlue() 构建一个水平方向的构建一个水平方向的 GlueGlue 组件组件

Box.createverticalGlue()Box.createverticalGlue() 构建一个垂直方向的构建一个垂直方向的 GlueGlue 组件组件

Page 20: Java 软件设计基础

School of Computer Science and Technology

–实例import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Boxes extends J Frame{

public Boxes(){super("BoxLayout");final int SIZE = 3;Container c = getContentPane();c.setLayout(new BorderLayout(30,30));Box boxes[ ] = new Box[4];boxes[0] = Box.createHorizontalBox();boxes[1] = Box.createVerticalBox();boxes[2] = Box.createHorizontalBox();boxes[3] = Box.createVerticalBox();for(int i=0;i<SIZE;i++) boxes[0].add(new J Button("class"+i));for(int i=0;i<SIZE;i++) boxes[1].add(new J Button("grade"+i));for(int i=0;i<SIZE;i++) boxes[2].add(new J Button("classroom"+i));for(int i=0;i<SIZE;i++) boxes[3].add(new J Button("restroom"+i));c.add(boxes[0],BorderLayout.NORTH);c.add(boxes[1],BorderLayout.WEST);c.add(boxes[2],BorderLayout.SOUTH);c.add(boxes[3],BorderLayout.EAST);setSize(350,300);show();

}public static void main(String args[]){

Boxes bb = new Boxes();bb.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){System.exit(0);}});

}}

Page 21: Java 软件设计基础

School of Computer Science and Technology

2. 菜单组件

• 菜单栏菜单栏–用来管理菜单,只能被添加到 Frame 对象中。作为整个菜单的根基

不参与交互操作。 Java 中,应用程序的菜单都包含在菜单栏对象中。在 awt 中由 MenuBar 负责创建,在 swing 中由 JMenuBar 负责创建。–构造方法与一般方法

• 菜单菜单–用来存放与整合菜单项的组件。菜单可以是单层的菜单,也可以为多

层结构。 awt 中由 Menu 负责创建, swing 中由 JMenu 负责创建。

JMenuBarJMenuBar类类

JMenuBar()JMenuBar() 创建一个空菜单栏创建一个空菜单栏

setJMenuBar(JMenuBar setJMenuBar(JMenuBar menu)menu)

将菜单栏添加到窗口的菜单栏区域将菜单栏添加到窗口的菜单栏区域

MenuBarMenuBar 类类MenuBar()MenuBar() 创建一个空菜单栏创建一个空菜单栏

add(Menu m)add(Menu m) 将 一 个将 一 个 MenuMenu 对 象对 象 mm 添 加 到 引 用 的添 加 到 引 用 的MenuBarMenuBar 对象中对象中

Page 22: Java 软件设计基础

School of Computer Science and Technology

–构造方法与一般方法

JMenuJMenu 类类

JMenu()JMenu() 创建一个无标签的菜单对象创建一个无标签的菜单对象

JMenu(String JMenu(String menuName)menuName)

创建一个菜单名为创建一个菜单名为 menuNamemenuName 的菜单对象的菜单对象

add(String s)add(String s) 向菜单增加指定的选项向菜单增加指定的选项

getItem(int n)getItem(int n) 获取指定索引处的菜单选项获取指定索引处的菜单选项

getItemCount()getItemCount() 获取菜单选项数目获取菜单选项数目

add(JMenuItem item)add(JMenuItem item) 将将 itemitem 添加到引用的菜单对象上添加到引用的菜单对象上

addSeparator()addSeparator() 在目前位置插入一条分隔线在目前位置插入一条分隔线

MenuMenu 类类

Menu()Menu() 创建一个无标签的菜单对象创建一个无标签的菜单对象

Menu(String Menu(String menuName)menuName)

创建一个菜单名为创建一个菜单名为 menuNamemenuName 的菜单对象的菜单对象

add(MenuItem item)add(MenuItem item) 将将 itemitem 添加到引用的菜单对象上添加到引用的菜单对象上

addSeparator()addSeparator() 在目前位置插入一条分隔线在目前位置插入一条分隔线

Page 23: Java 软件设计基础

School of Computer Science and Technology

• 菜单项菜单项–是菜单系统的基本组件,是用户最终选择的项目。在 awt 中由

MenuItem 负责创建,在 swing 中由 JMenuItem 负责创建。菜单项本身也可以是菜单,称为子菜单。

–菜单项也可以使用带复选框或单选按钮的菜单项,分别是:•awt : CheckBoxMenuItem

RadioButtonMenuItem

•swing: JCheckBoxMenuItem JRadioButtonMenuItem

•例:创建单选按钮菜单项和创建复选框菜单项ButtonGroup group = new ButtonGroup();J RadioButtonMenuItem SchItem = new J RadioButtonMenuItem(“J Radio”);group.add(SchItem);SchMenu.add(SchItem);

J CheckButtonMenuItem DoItem = new J CheckButtonMenuItem(“DoBar”);optionMenu.add(DoItem);

Page 24: Java 软件设计基础

School of Computer Science and Technology

–构造方法与一般方法:

JMenuItemJMenuItem类类

JMenuItem(String s)JMenuItem(String s) 创建名为创建名为 ss 的菜单项的菜单项

JMenuItem(String s,Icon i)JMenuItem(String s,Icon i) 创建名为创建名为 ss 、图标为、图标为 ii 的菜单项的菜单项

JRadioButtonMenuItem(String JRadioButtonMenuItem(String s)s)

创建标题为创建标题为 ss 带单选按钮的菜单项带单选按钮的菜单项

JCheckButtonMenuItem(String JCheckButtonMenuItem(String s)s)

创建标题为创建标题为 ss 带复选框的菜单项带复选框的菜单项

setEnabled(boolean b)setEnabled(boolean b) 设置当前菜单项是否可被选择设置当前菜单项是否可被选择

getLabel()getLabel() 获取菜单项名字获取菜单项名字

getKeyStroke(char keyChar)getKeyStroke(char keyChar) 返回一个字符型的返回一个字符型的 KeyStrokeKeyStroke 对对象象

setAccelerator(KeyStroke k)setAccelerator(KeyStroke k) 为菜单项设置快捷键为菜单项设置快捷键

MenuItemMenuItem 类类

MenuItem(String s)MenuItem(String s) 创建名为创建名为 ss 的菜单项的菜单项

getActionCommand()getActionCommand() 返回菜单项对象所产生的动作事件返回菜单项对象所产生的动作事件关联的命令名称关联的命令名称

disable()disable() 设置当前菜单项不可用设置当前菜单项不可用

JCheckButtonMenuItem(String JCheckButtonMenuItem(String s)s)

创建标题为创建标题为 ss 带复选框的菜单项带复选框的菜单项

getState()getState() 获取复选框的状态获取复选框的状态

setState(boolean b)setState(boolean b) 设置复选框的状态设置复选框的状态

Page 25: Java 软件设计基础

School of Computer Science and Technology

• 弹出式菜单弹出式菜单–不固定在菜单栏中,而是可以四处浮动显示,依附于某个容器或

组件,平时并不显示,在单击鼠标右键时显示。在 awt 中由PopupMenu 负责创建,在 swing 中由 JPopupMenu 负责创建。

• 菜单创建步骤菜单创建步骤–创建菜单栏对象,并将其加入到所建的框架中:

–创建菜单及其子菜单

J popupMenu popup = new J popupMenu();J MenuItem newItem = new J MenuItem(“Popup Menu”);popup.add(newItem);

J MenuBar menuBarName = new J MenuBar();setJ MenuBar(menuBarName);

J Menu fileMenu = new J menu(“File”);J Menu toolMenu = new J menu(“Tool”);J Menu optionMenu = new J menu(“Option”);

Page 26: Java 软件设计基础

School of Computer Science and Technology

–通过 Action 对象新建菜单项并添加事件监听器

–将菜单项加入到子菜单或菜单中,将子菜单加入到菜单中,将菜单加入到菜单栏中

• 实例实例

newItem = fileMenu.add(new ShowAction(“New”));

fileMenu.add(newItem);toolMenu.add(optionMenu);menuBarName.add(fileMenu);menuBarName.add(toolMenu);

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class MenuExam extends J Frame{

private J Label display;public MenuExam(){

super(“Menu演示程序”);J MenuBar bar = new J MenuBar();setJ MenuBar(bar);J Menu fileMenu = new J Menu(“File”);

Page 27: Java 软件设计基础

School of Computer Science and Technology

–续J MenuItem fileNew = new J MenuItem(“New”);J MenuItem fileOpen = new J MenuItem(“Open”);J MenuItem fileSave = new J MenuItem(“Save”);J MenuItem fileExit = new J MenuItem(“Exit”);

fileMenu.add(fileNew); fileMenu.add(fileOpen);fileMenu.add(fileSave); fileMenu.add(fileExit); bar.add(fileMenu);fileExit.addListener(new ActionListener(){

public void actionPerformed(ActionEvent e){System.exit(0);

}});J Menu editMenu = new J Menu(“Edit”);

J MenuItem copyMenu = new J MenuItem(“Copy”);J MenuItem pasteMenu = new J MenuItem(“Paste”);J MenuItem cutMenu = new J MenuItem(“Cut”);J MenuItem selectMenu = new J MenuItem(“Select”);

editMenu.add(copyMenu); editMenu.add(pasteMenu); editMenu.add(cutMenu); editMenu.addSeparator();editMenu.add(selectMenu); bar.add(editMenu);

Page 28: Java 软件设计基础

School of Computer Science and Technology

–续J Menu formatMenu = new J Menu(“Format”);

J MenuItem colorMenu = new J MenuItem(“Color”);J MenuItem fontMenu = new J MenuItem(“Font”);

formatMenu.add(colorMenu); formatMenu.add(fontMenu);bar.add(formatMenu);setSize(300,200);show();

}public static void main(String args[]){

MenuExam mm = new MenuExam();mm.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){System.exit(0);

}});

}

Page 29: Java 软件设计基础

School of Computer Science and Technology

3.swing 组件

• 概述概述–swing 组件与 awt 组件的比较

•swing 组件在 awt 基础上构建起来的,基于 awt 的事件处理机制;所以完全舍弃 awt 包不太可能;

•swing 组件几乎都是轻量级组件。•swing 采取了“模型 - 视图 - 控制器” (MVC: Model-View-

Controller) 的设计范式,其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。

•新版的 swing 包可能与旧版不完全兼容;•awt 包的运行速度比 swing快,但 swing 的功能更趋于完善。

–采用 swing 进行 GUI 设计的一般流程•引入 swing 包,基于使用感觉选择合适的外观并设置顶层容器;•向容器内添加并设置组件;•在组件周围添加辅助属性并进行事件处理。

Page 30: Java 软件设计基础

School of Computer Science and Technology

–swing 中的包javax.swingjavax.swing swingswing组件和实用工具组件和实用工具

javax.swing.borderjavax.swing.border swingswing轻组件的边框轻组件的边框

javax.swing.colorchooserjavax.swing.colorchooser JColorChooseJColorChoose 的支持类的支持类 // 接口接口

javax.swing.eventjavax.swing.event 事件和监听器类事件和监听器类

javax.swing.plafjavax.swing.plaf 抽象类,定义抽象类,定义 UIUI代理的行为代理的行为

javax.swing.plaf.basicjavax.swing.plaf.basic 实现所有标准界面样式公共功能的基类实现所有标准界面样式公共功能的基类

javax.swing.plaf.metaljavax.swing.plaf.metal 用户界面代理类,实现用户界面代理类,实现 MetalMetal界面样式界面样式

javax.swing.tablejavax.swing.table JTableJTable组件的支持类组件的支持类

javax.swing.textjavax.swing.text 支持文档的显示和编辑支持文档的显示和编辑

javax.swing.text.htmljavax.swing.text.html 支持显示和编辑支持显示和编辑 htmlhtml文件文件

javax.swing.text.html.parserjavax.swing.text.html.parser htmlhtml文件的分析器类文件的分析器类

javax.swing.text.rtfjavax.swing.text.rtf 支持显示和编辑支持显示和编辑 RTFRTF文件文件

javax.swing.treejavax.swing.tree JTreeJTree组件的支持类组件的支持类

javax.swing.undojavax.swing.undo 支持取消操作支持取消操作

com.sun.javax.swing.plaf.mocom.sun.javax.swing.plaf.motiftif

用户界面代理类,它们实现用户界面代理类,它们实现 MotifMotif界面样式界面样式

com.sun.javax.swing.plaf.wicom.sun.javax.swing.plaf.windowsndows

用户界面代理类,它们实现用户界面代理类,它们实现 WindowsWindows界面样式界面样式

com.sun.javax.swing.plaf.gtkcom.sun.javax.swing.plaf.gtk 用户界面代理类,它们实现用户界面代理类,它们实现 GTKGTK界面样式界面样式

Page 31: Java 软件设计基础

School of Computer Science and Technology

–swing 包中的类层次结构

javax.swing.J Component

J FormattedTextField

AbstractButton

J FileChooser

J InternalFrame

J ComboBox

J Label

J DesktopPane

J Panel

J List

J MenuBar

J TextComponent

J Button

J MenuItem

J PasswordField

java.awt.Container

java.awt.Component

java.lang.Object

J ToggleButton

J CheckBoxMenuItem

J Menu

J RadioButtonMenuItem

J CheckBox

J RadioButton

J TextArea

J EditorPane

J TextField……

J LayeredPane

……

J Table

Page 32: Java 软件设计基础

School of Computer Science and Technology

–swing 组件的分类•按照功能划分

–基 本 控 件 : 实 现 人 机 交 互 的 基 本 组 件 。 包 括JButton、 JcomboBox、 JList、 JMenu、 JSlider、 JTextField、 JTexAtrea、 JPasswordField ;

–顶层容器:包括 JFrame、 JApplet、 JDialog、 JWindow ;–中 间 容 器 : 涵 盖

JPanel、 JScrollPane、 JSplitPane、 JLayeredPane、 JToolBar ;

–特殊容器:在 GUI 上起特殊作用的中间层,如 JInternalFrame( 内部窗件 ) 、 JRootPane 。

•按 swing 组件对信息的可编辑与否划分–不可编辑信息的显示:如 JLabel、 JProgressBar、 ToolTip ;–可 编 辑 信 息 的 显 示 : 如

JTextField、 JTextArea、 JPasswordField、 JColorChooser、JFileChooser、 JTable 。

Page 33: Java 软件设计基础

School of Computer Science and Technology

• 组件常用方法组件常用方法–组件的颜色

•组件背景色的设置方法:

•组件前景色的设置方法:

•组件背景色的获取方法:

•组件前景色的获取方法:

•上述方法中都涉及 Color 类, Color 类是 java.awt 包中的类,该类窗件的对象称为颜色对象, Color 类的构造方法如下:

–其中 red、 green、 blue 的取值在 0~255 之间。

public void setBackground(Color c)public void setBackground(Color c)

public void setForeground(Color c)public void setForeground(Color c)

public Color getBackground()public Color getBackground()

public Color getForeground()public Color getForeground()

public Color(int red, int green, int blue)public Color(int red, int green, int blue)

Page 34: Java 软件设计基础

School of Computer Science and Technology

– 组件的字体• 组件字体的设置方法:

• 组件字体的获取方法:

•上述方法用到了 java.awt 包中的 Font 类,该类的构造方法如下:

– name :字体名字,如果系统不支持字体的名字,将取默认名字创建字体对象;

– style : 字 体 样 式 , 有 效 取 值 为Font.BOLD、 Font.PLAIN、 Font.ITALIC、 Font.ROMAN_BASELINE、 Font.CENTER_BASELINE、 Font.HANGING_BASELINE、 Font.TRUETYPE_FONE ;

– size :字体大小,单位是磅。•获取系统中可以提供的字体名字,可以通过 GraphicsEnvironment

对象调用 getAvailableFoneFamilyNames() 方法将可用字体名称存放到字符串数组中。

public void setFont(Font f)public void setFont(Font f)

public void getFont()public void getFont()

public Font(String name, int style, int size)public Font(String name, int style, int size)

Page 35: Java 软件设计基础

School of Computer Science and Technology

–组件的边框:•组件边框的设置方法:

•组件边框的获取方法:

•默认情况下组件的边框是黑边矩形。–组件透明

•设置组件的透明性:

–isOpa取 false 时组件为透明,取 true 时被设置为不透明;•获取组件的透明性:

–组件透明时返回值为 false ,否则返回值为 true ;

public void setBorder(Border b)public void setBorder(Border b)

public Border getBorder()public Border getBorder()

public void setOpaque(boolean isOpa)public void setOpaque(boolean isOpa)

public boolean getOpaque()public boolean getOpaque()

Page 36: Java 软件设计基础

School of Computer Science and Technology

– 组件的大小与位置•

设置组件的大小, width 指定组件的宽度, height 指定组件的高度。

设置组件在容器中的位置。•

返回一个 Dimension 对象下组件的宽度和高度值。•

返回一个含有成员变量x 和 y 的 Point 对象的引用, x 和 y 就是组件在容器中的坐标。

设置组件在容器中的位置和组件的大小。

返回一个含有成员变量x 、 y、width和 height的Rectangle对象的引用。

public void setSize(int width, int height)public void setSize(int width, int height)

public void setLocation(int x, int y)public void setLocation(int x, int y)

public Dimension getSize()public Dimension getSize()

public Point getLocation()public Point getLocation()

public void setBounds(int x, int y, int width, int height)public void setBounds(int x, int y, int width, int height)

public Rectangle getBounds()public Rectangle getBounds()

Page 37: Java 软件设计基础

School of Computer Science and Technology

–组件的激活与可见性•

设置组件是否可被激活,当 b 为 true 时组件可被激活,否则组件不可激活。

设置组件在该容器中的可见性,当 b 为 true 时组件可见,否则组件不可见。

–实例

public void setEnable(boolean b)public void setEnable(boolean b)

public void setVisible(boolean b)public void setVisible(boolean b)

import java.awt.*;import java.awt.event.*;import javax.swing.*;class CompExam extends J Frame implements ItemListener{

J ComboBox list;J TextArea text;CompExam(String s){

super(s);setSize(260,270);setLocation(120,120);setVisible(true);setDefaultCloseOperation(J Frame.DISPOSE_ON_CLOSE);

Page 38: Java 软件设计基础

School of Computer Science and Technology

–续text = new J TextArea(12,12);list = new J ComboBox();list.setBackground(Color.pink);text.setForeground(Color.blue);GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();String fontName[] = ge.getAvailableFontFamilyNames();for(int i=0;i<fontName.length;i++) list.addItem(fontName[i]);Container c = getContentPane();c.add(list,BorderLayout.NORTH);c.add(text,BorderLayout.CENTER);list.addItemListener(this);setVisible(true);setBounds(100,120,300,200);validate();

}public void itemStateChanged(ItemEvent e){

String name = (String)list.getSelectedItem();Font f = new Font(name,Font.BOLD,24);text.setFont(f);text.setText("Font test example");

}}

Page 39: Java 软件设计基础

School of Computer Science and Technology

–续public class MethodExam{

public static void main(String args[]){CompExam con =new CompExam("Example");

}}

Page 40: Java 软件设计基础

School of Computer Science and Technology

• JFrameJFrame 窗体窗体–JFrame 是 GUI 中的一个框架容器。 javax.swing 包中的

JFrame是 java.awt 包中 Frame 类的子类。–构造方法:

–一般方法:

JFrame()JFrame() 创建一个不含标题的新创建一个不含标题的新 JFrameJFrame 类窗体对象类窗体对象

JFrame(String s)JFrame(String s) 创建一个标题为创建一个标题为 ss 的新的新 JFrameJFrame 类窗体对象类窗体对象

setSize(int width, int height)setSize(int width, int height) 设置设置 JFrameJFrame 对象的宽和高对象的宽和高

setBackground(Color c)setBackground(Color c) 设置设置 JFrameJFrame 对象的背景色对象的背景色

setVisible(boolean b)setVisible(boolean b) 设置设置 JFrameJFrame 对象的可见性对象的可见性

setResizable(boolean b)setResizable(boolean b) 设置设置 JFrameJFrame 对象是否可以改变大小对象是否可以改变大小

JMenuBar getMenuBar()JMenuBar getMenuBar() 获得窗口中的菜单栏组件获得窗口中的菜单栏组件

remove(Component c)remove(Component c) 将窗口中指定的组件移除将窗口中指定的组件移除

setDefaultCloseOperation(int op)setDefaultCloseOperation(int op) 单击窗体关闭按钮时的默认操作单击窗体关闭按钮时的默认操作

setBounds(int x, int y, int width, setBounds(int x, int y, int width, int height)int height)

设置窗口的坐标和大小设置窗口的坐标和大小

Page 41: Java 软件设计基础

School of Computer Science and Technology

–使用 JFrame 的流程•当应用程序需要一个窗口时,可使用 JFrame 或其子类创建一个

对象,窗口默认的被系统添加到显示器屏幕上。•JFrame 窗体通过调用方法 getContentPane()得到它的内容

面板。•将组件添加到 JFrame 窗体的内容面板中去。

• 标签与文本组件标签与文本组件–标签组件

•JLabel 大体与 Label 一致,但它允许添加图像,而且当鼠标的光标停留在标签位置时会显示一段文字提示。

•构造方法:JLabel()JLabel() 创建没有名字的标签对象创建没有名字的标签对象

JLabel(String s)JLabel(String s) 创建名字为创建名字为 ss 的标签对象的标签对象

JLabel(Icon icon)JLabel(Icon icon) 创建具有图标创建具有图标 iconicon 的标签对象,图标左对齐的标签对象,图标左对齐

JLabel(String s, int JLabel(String s, int align)align)

创建名字为创建名字为 ss 、对齐方式为、对齐方式为 alignalign 的标签对象的标签对象

Page 42: Java 软件设计基础

School of Computer Science and Technology

•一般方法

–文本组件•JTextField 类:定义一个可以输入单行文字的矩形区域文本框;

getText()getText() 获取标签名字获取标签名字

setIcon(Icon icon)setIcon(Icon icon) 设置标签图标设置标签图标

setText(String s)setText(String s) 设置标签对象的文字设置标签对象的文字

setAlignment(int align)setAlignment(int align) 设置标签对象的对齐方式设置标签对象的对齐方式

JTextField()JTextField() 创建一个空文本框对象创建一个空文本框对象

JTextField(String s)JTextField(String s) 创建一个内容为创建一个内容为 ss 的文本框对象的文本框对象

JTextField(String s, int n)JTextField(String s, int n) 创建一个内容为创建一个内容为 ss 、列为、列为 nn 的文本框对象的文本框对象

int getColumns()int getColumns() 获得文本框对象的列数获得文本框对象的列数

setColumns(int n)setColumns(int n) 设置文本框对象的列数设置文本框对象的列数

setFont(Font f)setFont(Font f) 设置文本框的字体设置文本框的字体

addActionListener(ActionListeaddActionListener(ActionListener e)ner e)

将监听者注册给文本框对象将监听者注册给文本框对象

Page 43: Java 软件设计基础

School of Computer Science and Technology

•JTextArea 类:定义一个可以输入单行文字的矩形区域文本框;

•JPasswordField 类:定义一个密码框对象。

–事件机制•事件源

–能够产生时间的对象都可以称为事件源,如文本框、按钮、下拉式列表等等。

getColumns()getColumns() 获得对象的列数获得对象的列数

setEditable(boolean b)setEditable(boolean b) 指定文本域的可编辑性指定文本域的可编辑性

setAlignment(int align)setAlignment(int align) 设置文本域的对齐方式设置文本域的对齐方式

setIcon(Icon icon)setIcon(Icon icon) 设置图标设置图标

setText(String s)setText(String s) 设置文字设置文字

setEchoChar(char c)setEchoChar(char c) 设置回显字符设置回显字符

char[ ] getPassword()char[ ] getPassword() 返回密码框中的密码返回密码框中的密码

Page 44: Java 软件设计基础

School of Computer Science and Technology

•监听器–通过对事件源进行监听,一以便对发生的事件做处理。事件源通过调

用相应的方法注册相应的监听器。对于注册了监听器的对象,系统将自动调用相应的事件类创建该类事件的实例,并通知监听器。

•处理事件的接口–当事件源发生事件时,接口立刻通知监听器自动调用实现的某个接口

方法,接口方法规定了怎样处理事件的操作。•实例:

import java.awt.*;import java.awt.event.*;import javax.swing.*;class MyWindow extends J Frame implements ActionListener{

J TextField titleText;J PasswordField passwordText;private J Label lab1,lab2;MyWindow(String s){

super(s);lab1 = new J Label("name");titleText = new J TextField(10);lab2 = new J Label("password");

Page 45: Java 软件设计基础

School of Computer Science and Technology

–续passwordText = new J PasswordField(10);passwordText.setEchoChar('*');titleText.addActionListener(this);passwordText.addActionListener(this);Container con = getContentPane();con.setLayout(new FlowLayout());con.add(lab1); con.add(titleText);con.add(lab2); con.add(passwordText);con.setBounds(100,100,200,150);con.setBackground(Color.pink);setVisible(true);validate();setDefaultCloseOperation(J Frame.EXIT_ON_CLOSE);

}public void actionPerformed(ActionEvent e){

if(e.getSource()==titleText) this.setTitle(titleText.getText());else if(e.getSource()==passwordText){

char c[] = passwordText.getPassword();titleText.setText(new String(c));

}}

}

Page 46: Java 软件设计基础

School of Computer Science and Technology

–续public class TExample{

public static void main(String args[]){MyWindow win = new MyWindow("TextField Example");

}}

Page 47: Java 软件设计基础

School of Computer Science and Technology

• 按钮组件按钮组件–AbstractButton 类派生出两个组件:

•JButton 组件: swing 按钮;•JToggleButton 组件:单选按钮 (JRadioButton) 和复选框

(JCheckButton) 的父类。–JButton 类的构造方法:

–JButton 类的一般方法:

JButton()JButton() 构造无标题按钮对象构造无标题按钮对象

JButton(String s)JButton(String s) 构造标题为构造标题为 ss 的按钮对象的按钮对象

JButton(Icon icon)JButton(Icon icon) 构造图标为构造图标为 iconicon 的按钮对象的按钮对象

JButton(String s, Icon JButton(String s, Icon icon)icon)

构造标题为构造标题为 ss 、图标为、图标为 iconicon 的按钮对象的按钮对象

addActionListener(ActionListener addActionListener(ActionListener e)e)

给按钮对象增加动作监听器,即注册给按钮对象增加动作监听器,即注册

removeActionListener(ActionListremoveActionListener(ActionListener e)ener e)

移去按钮上的监听器移去按钮上的监听器

setText(String s)setText(String s) 设置文字设置文字

Page 48: Java 软件设计基础

School of Computer Science and Technology

–实例

getText()getText() 获取按钮标签文字获取按钮标签文字

setIcon(Icon icon)setIcon(Icon icon) 设置按钮图标设置按钮图标

getIcon()getIcon() 获取按钮图标获取按钮图标

setEnabled(boolean b)setEnabled(boolean b) 设置当前按钮的可用性设置当前按钮的可用性

inSelected()inSelected() 获取按钮状态获取按钮状态

setHorizontalTextPosition(int setHorizontalTextPosition(int textPosition)textPosition)

设置按钮名相对水平位置设置按钮名相对水平位置 (LEFT/CENTER/(LEFT/CENTER/RIGHT)RIGHT)

setVerticalTextPosition(int setVerticalTextPosition(int textPosition)textPosition)

设置按钮名相对垂直位置设置按钮名相对垂直位置 (TOP/CENTER/(TOP/CENTER/BOTTOM)BOTTOM)import javax.swing.*;

import java.awt.*;import java.awt.event.*;public class LabBut extends J Frame{

private J Label lab1,lab2;private J Button but1,but2;public LabBut(){

super("Label and Button");Container c = getContentPane();c.setLayout(new FlowLayout(100,100,10));Icon icon = new ImageIcon("1.jpg");Icon icon1=new ImageIcon("2.jpg");Icon icon2=new ImageIcon("3.jpg");

Page 49: Java 软件设计基础

School of Computer Science and Technology

–续lab1 = new J Label("Label with text and image",icon,SwingConstants.CENTER);lab1.setToolTipText("This is a label");lab1.setHorizontalTextPosition(SwingConstants.CENTER);lab1.setVerticalTextPosition(SwingConstants.BOTTOM);c.add(lab1);Icon icon1=new ImageIcon("2.jpg");Icon icon2=new ImageIcon("3.jpg");but1 = new J Button("Button1 with function");c.add(but1);but2 = new J Button("Button2 with function",icon2);but2.setRolloverIcon(icon1);c.add(but2);but1.addActionListener(new listener());but2.addActionListener(new listener());setSize(360,200);show();

}public static void main(String args[]){

LabBut lb = new LabBut();lb.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){System.exit(0);

}});

}

Page 50: Java 软件设计基础

School of Computer Science and Technology

–续private class listener implements ActionListener{

public void actionPerformed(ActionEvent e){J OptionPane.showMessageDialog(null,"You pressed:"+e.getActionCommand());

}}

}

Page 51: Java 软件设计基础

School of Computer Science and Technology

–复选框与单选按钮•JCheckButton

–构造方法

–一般方法

•JRadioButton–Java 提供 ButtonGroup 类为单选按钮类提供多选一功能,当创建

了若干个单选按钮后,需要将这些按钮添加到 ButtonGroup 的实例中去。

–JRadioButton 构造方法与一般方法与复选框类似,略。

JCheckBox()JCheckBox() 创建一个无标签复选框对象创建一个无标签复选框对象

JCheckBox(String s)JCheckBox(String s) 创建一个标签为创建一个标签为 ss 的复选框对象的复选框对象

JCheckBox(String s, Icon JCheckBox(String s, Icon icon)icon)

创建一个标签为创建一个标签为 ss 、图标为、图标为 iconicon 的复选框对象的复选框对象

JCheckBox(String s, JCheckBox(String s, boolean b)boolean b)

创建一个标签为创建一个标签为 ss 、状态为、状态为 bb 的复选框对象的复选框对象

void void addItemListener(ItemListener addItemListener(ItemListener i)i)

注册注册 ItemListenerItemListener监听器监听器

public boolean isSelected()public boolean isSelected() 返回复选框状态返回复选框状态

public void public void setSelected(boolean b)setSelected(boolean b)

设置复选框状态设置复选框状态

Page 52: Java 软件设计基础

School of Computer Science and Technology

•复选框与单选按钮事件–这两种组件引发的事件由 ItemEvent 类派生,该类包含了一个

ITEM_STATE_CHANGE事件。–ItemEvent 类的主要方法:

»Object.getItem()方法:告知用户是哪个选择项的状态发生变化;»int getStateChange()方法:是用户知道选中了哪个选项。

•实例:

import javax.swing.*;import java.awt.*;import java.awt.event.*;public class RunJ Radio extends J Frame{

J Panel jp;J RadioButton jrb1 = new J RadioButton("Male",true);J RadioButton jrb2 = new J RadioButton("Female");J RadioButton jrb3 = new J RadioButton("student");ButtonGroup bg = new ButtonGroup();

Page 53: Java 软件设计基础

School of Computer Science and Technology

–续public RunJ Radio(){

super("J RadioButton");setSize(350,100);jp = new J Panel();bg.add(jrb1);bg.add(jrb2);jp.add(jrb1);jp.add(jrb2);jp.add(jrb3);this.setContentPane(jp);

}public static void main(String args[]){

RunJ Radio r = new RunJ Radio();r.show();r.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){System.exit(0);

}});

}}

Page 54: Java 软件设计基础

School of Computer Science and Technology

• 下拉列表组件下拉列表组件–下拉列表 (JComboBox)

•构造方法

•一般方法

JComboBox()JComboBox() 创建空下拉列表框创建空下拉列表框

JComboBox(Vector vect)JComboBox(Vector vect) 使用向量表创建一个下拉列表对象使用向量表创建一个下拉列表对象

JComboBox(ComboBoxModel JComboBox(ComboBoxModel model)model)

从已有的从已有的 modelmodel 获得选项创建下拉列表对获得选项创建下拉列表对象象

JComboBox(Object[ ] items)JComboBox(Object[ ] items) 使用数组创建下拉列表对象使用数组创建下拉列表对象

void void addActionListener(ActionListener addActionListener(ActionListener e)e)

注册事件对象给注册事件对象给 ActionListenerActionListener

void void addItemListener(ItemListener e)addItemListener(ItemListener e)

注册事件对象给注册事件对象给 ItemListenerItemListener

void addItem(Object obj)void addItem(Object obj) 添加选项添加选项

Object getItemAt(int index)Object getItemAt(int index) 获取指定位置的选项获取指定位置的选项

int getItemCount()int getItemCount() 获得当前选项的数目获得当前选项的数目

public Object getSelectedItem()public Object getSelectedItem() 获得被选项获得被选项

Page 55: Java 软件设计基础

School of Computer Science and Technology

•实例

void setEditable(boolean b)void setEditable(boolean b) 设置是否可以编辑设置是否可以编辑

int getSelectedIndex()int getSelectedIndex() 获取被选中项的索引获取被选中项的索引

void removeAllItems()void removeAllItems() 移除全部选项移除全部选项

void removeItemAt(int void removeItemAt(int index)index)

移除索引为移除索引为 indexindex 处的选项处的选项

void remove(Component void remove(Component comp)comp)

移除指定的组件移除指定的组件

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Combo extends J Frame{

private J ComboBox images;private J Label label;private String names[]={"1.jpg","2.jpg","3.jpg"};private Icon icons[]={new ImageIcon(names[0]),new ImageIcon(names[1]),new ImageIcon(names[2])};public Combo(){

super("J ComboBox Example");Container c=getContentPane();c.setLayout(new FlowLayout());images=new J ComboBox(names);images.setMaximumRowCount(2);

Page 56: Java 软件设计基础

School of Computer Science and Technology

images.addItemListener(new ItemListener(){public void itemStateChanged(ItemEvent e){

label.setIcon(icons[images.getSelectedIndex()]);}

});c.add(images);label=new J Label(icons[0]);c.add(label);setSize(450,200);show();

}public static void main(String args[]){

Combo cb=new Combo();cb.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){System.exit(0);

}});

}}

Page 57: Java 软件设计基础

School of Computer Science and Technology

–列表 (JList)•构造方法

•一般方法

•实例

JList()JList() 创建一个空列表对象创建一个空列表对象

JList(Vector vect)JList(Vector vect) 使用向量表创建一个列表对象使用向量表创建一个列表对象

JList(Object[ ] items)JList(Object[ ] items) 使用数组创建一个列表对象使用数组创建一个列表对象

int [ ] getSelectedIndices()int [ ] getSelectedIndices() 获得被选取的多个项获得被选取的多个项

int getSelectedIndex(int i)int getSelectedIndex(int i) 获得选取的单个项获得选取的单个项

void setVisibleRowCount(int num)void setVisibleRowCount(int num) 设置可见的列表选项设置可见的列表选项

void void addListSelectionListener(ListSelectionListeneaddListSelectionListener(ListSelectionListener e)r e)

注册监听器注册监听器

int getVisibleRowCount()int getVisibleRowCount() 获得可见的列表选项值获得可见的列表选项值import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;

Page 58: Java 软件设计基础

School of Computer Science and Technology

public class J ListEx extends J Frame{private J List images;private J Label label;private String names[]={"1.jpg","2.jpg","3.jpg"};private Icon icons[]={new ImageIcon(names[0]),new ImageIcon(names[1]),new

ImageIcon(names[2])};public J ListEx(){

super("J List Example");Container c=getContentPane();c.setLayout(new FlowLayout());images=new J List(names);images.setVisibleRowCount(2);images.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);c.add(new J ScrollPane(images));label=new J Label(icons[0]);c.add(label);images.addListSelectionListener(new ListSelectionListener(){

public void valueChanged(ListSelectionEvent e){label.setIcon(icons[images.getSelectedIndex()]);

}});setSize(200,200);show();

}

Page 59: Java 软件设计基础

School of Computer Science and Technology

public static void main(String args[]){J ListEx jl=new J ListEx();jl.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){System.exit(0);

}});

}}

Page 60: Java 软件设计基础

School of Computer Science and Technology

• 表格组件表格组件–JTable是 Swing新增的组件,主要功能是将数据以二维表格

的形式显示出来。

–一般方法

JTable()JTable() 创建一个默认模式的表格对象创建一个默认模式的表格对象

JTable(Object data[ ][ ], Object JTable(Object data[ ][ ], Object columnName[ ])columnName[ ])

创建一个表格对象,用来显示二维数组 创建一个表格对象,用来显示二维数组 data data 中的中的值,其列名称为 值,其列名称为 columnNamecolumnName

JTable(TableModel dm, JTable(TableModel dm, TableColumnModel cm, TableColumnModel cm, TableSelectionModel sm)TableSelectionModel sm)

构造 表格对象,使用 构造 表格对象,使用 dm dm 作为数据模型、作为数据模型、 cm cm 作作为列模型和 为列模型和 sm sm 作为选择模型对其进行初始化作为选择模型对其进行初始化

getContentPane().getContentPane(). 属属性性

获取设置框架中获取设置框架中 contentPanecontentPane面板对象下的属性值面板对象下的属性值

repaint();repaint(); 表格更新显示表格更新显示

getRowCount();getRowCount(); 获取表格行数获取表格行数

getColumnCount();getColumnCount(); 获取表格列数获取表格列数

getColumnName(int getColumnName(int col);col);

获取表格某列名字获取表格某列名字

Page 61: Java 软件设计基础

School of Computer Science and Technology

–注意:•用户在表格单元中输入的数据都被认为是一个 Object 对象;•表格中的数据将以行和列的形式显示数组 data 每个单元中对象的

字符串表示。–实例

getValueAt(int row, int col)getValueAt(int row, int col) 获取现有表格某行某列的数据获取现有表格某行某列的数据

setValueAt(Object value, int row, setValueAt(Object value, int row, int col)int col)

改变现有表格某行某列的数据改变现有表格某行某列的数据

import java.awt.*;import java.awt.event.*;import javax.swing.*;class J TableWin extends J Frame implements ActionListener{

J Table table;Object a[][];Object name[]={"Name","Num","Price","Sell"};J Button sumRows,sumColumns;J TextField inputRowsNumber;int initRows=1;J Panel pSouth,pNorth;int count=0,rowsNumber=0;

Page 62: Java 软件设计基础

School of Computer Science and Technology

J TableWin(String s){super(s);sumRows=new J Button("Good Sales");sumColumns=new J Button("Total Sales");inputRowsNumber=new J TextField(4);sumRows.addActionListener(this);sumColumns.addActionListener(this);inputRowsNumber.addActionListener(this);pSouth=new J Panel();pNorth=new J Panel();pNorth.add(new J Label("Input row number,press Enter to confirm"));pNorth.add(inputRowsNumber);inputRowsNumber.setBackground(Color.pink);pSouth.add(sumRows);pSouth.add(sumColumns);getContentPane().add(pSouth,BorderLayout.SOUTH);getContentPane().add(pNorth,BorderLayout.NORTH);getContentPane().add(new J ScrollPane(table),BorderLayout.CENTER);setSize(370,250);setVisible(true);getContentPane().validate();setDefaultCloseOperation(J Frame.EXIT_ON_CLOSE);

}

Page 63: Java 软件设计基础

School of Computer Science and Technology

public void actionPerformed(ActionEvent e){if(e.getSource()==inputRowsNumber){

count=0;initRows=Integer.parseInt(inputRowsNumber.getText());a=new Object[initRows][4];for(int i=0;i<initRows;i++){

for(int j=0;j<4;j++){if(j>0) a[i][j]="0";else a[i][j]="";

}}table=new J Table(a,name);table.setRowHeight(20);getContentPane().removeAll();getContentPane().add(new J ScrollPane(table),BorderLayout.CENTER);getContentPane().add(pSouth,BorderLayout.SOUTH);getContentPane().add(pNorth,BorderLayout.NORTH);validate();

}else if(e.getSource()==sumRows){

int rows=table.getRowCount();for(int i=0;i<rows;i++){

double sum=1;boolean b=true;

Page 64: Java 软件设计基础

School of Computer Science and Technology

for(int j=1;j<=2;j++){try{

sum=sum*Double.parseDouble(a[i][j].toString());}catch(Exception exception){

b=false;table.repaint();

}if(b==true){

a[i][3]=""+sum;table.repaint();

}}

}}else if(e.getSource()==sumColumns){

rowsNumber=table.getRowCount();if(count==0) count++;else rowsNumber=rowsNumber-1;double totalSum=0;for(int j=0;j<rowsNumber;j++) totalSum=totalSum+Double.parseDouble(a[j][3].toString());Object b[][]=new Object[rowsNumber+1][4];for(int i=0;i<rowsNumber;i++)

for(int j=0;j<4;j++)b[i][j]=a[i][j];

b[rowsNumber][0]="There are"+rowsNumber+"classes of goods";b[rowsNumber][3]="Total salse:"+totalSum;

Page 65: Java 软件设计基础

School of Computer Science and Technology

a=b;table=new J Table(a,name);getContentPane().removeAll();getContentPane().add(new J ScrollPane(table),BorderLayout.CENTER);getContentPane().add(pSouth,BorderLayout.SOUTH);getContentPane().add(pNorth,BorderLayout.NORTH);validate();

}}

}public class J TableEx{

public static void main(String args[]){J TableWin jw=new J TableWin("Table of sales");

}}

Page 66: Java 软件设计基础

School of Computer Science and Technology

• 进度条组件进度条组件–JProgressBar 类通过用颜色动态填充显示某任务完成的百分

比。–构造方法

–一般方法

JProgressBar()JProgressBar() 创建一个水平进度条,最小为创建一个水平进度条,最小为 00 ,最大为,最大为 100100

JProgressBar(int min, int max)JProgressBar(int min, int max) 创建一个水平进度条,最小为创建一个水平进度条,最小为 minmin ,最大为,最大为 maxmax

JProgressBar(int orient, int JProgressBar(int orient, int min, int max)min, int max)

创建一个进度条,最小为创建一个进度条,最小为 minmin ,最大为,最大为maxmax ,, orientorient 为为 HORIZONTALHORIZONTAL 则为水平则为水平条,条, VERTICALVERTICAL 则为垂直条则为垂直条

addChangeListener(ChangeListaddChangeListener(ChangeListener e)ener e)

进度条注册监听器进度条注册监听器

getMaximumgetMaximum 获得进度条最大值获得进度条最大值

getMinimumgetMinimum 获得进度条最小值获得进度条最小值

setMaximum(int n)setMaximum(int n) 设置进度条最大值设置进度条最大值

setMinimum(int n)setMinimum(int n) 设置进度条最小值设置进度条最小值

getValuegetValue 获得进度条当前值获得进度条当前值

setValue(int n)setValue(int n) 设置进度条当前值设置进度条当前值

Page 67: Java 软件设计基础

School of Computer Science and Technology

–注意•进度条的最大值并不是进度条的长度,进度条的长度依赖于放置它

的布局和本身是否试用了 setSize() 设置了大小;•进度条的最大值max 是指将进度条平均分成max份。

–实例

setString(String s)setString(String s) 设置进度条上文字信息设置进度条上文字信息

setBorderPainted(boolean b)setBorderPainted(boolean b) 设置进度条边框是否显示设置进度条边框是否显示

setStringPainted(boolean b)setStringPainted(boolean b) 设置使用百分数还是字符串表示进度设置使用百分数还是字符串表示进度

import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;public class J ProgressBarEx extends J Frame{

private J ProgressBar bar;private J Button but;private Container c;private J Label label;

Page 68: Java 软件设计基础

School of Computer Science and Technology

public J ProgressBarEx(){super("J ProgressBar Example");c=getContentPane();c.setLayout(new FlowLayout());bar=new J ProgressBar();but=new J Button("presentation");c.add(but);bar.setForeground(Color.blue);c.add(bar);label=new J Label();c.add(label);but.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){if(bar.getValue()!=bar.getMaximum()) bar.setValue(bar.getValue()+15);else bar.setValue(bar.getMinimum());

}});bar.addChangeListener(new ChangeListener(){

public void stateChanged(ChangeEvent e){

label.setText("min:"+bar.getMinimum()+";max:"+bar.getMaximum()+";now:"+bar.getValue());}

});setSize(350,150);show();

}

Page 69: Java 软件设计基础

School of Computer Science and Technology

public static void main(String args[]){J ProgressBarEx jpb=new J ProgressBarEx();jpb.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){System.exit(0);

}});

}}

Page 70: Java 软件设计基础

School of Computer Science and Technology

• 树组件树组件–简介

•JTree 用来显示一个层次关系分明的一组数据,用树状图表示能给用户一个直观而易用的感觉。 JTree 可以通过树形结构分层组织数据来让用户清楚的了解各个节点之间的关系。

•要构造一个树组件必须事先创建出称为节点的对象。节点是树中最基本的对象,表示在给定层次结构中的数据项。树中只有一个根节点,除此以外的节点分为两类:

–叶节点(即没有子节点的节点)–分支节点(即有子节点的节点)

•每个节点关联着一个描述该节点的文本标签和图像图标,其中:–文本标签是节点的字符串表示–图标指明该节点是否为叶节点

Page 71: Java 软件设计基础

School of Computer Science and Technology

–实现•javax.swing.tree 包中提供了一个 MutableTreeNode 接口

来实现创建并成为树节点的对象。•DefaultMutableTreeNode 类 是 实 现 了

MutableTreeNode 接口的类,可以使用这个类为要创建的树准备节点,其常用构造方法如下:

•注册监听器:–addTreeSelectionListener(TreeSelectionListener e)–当鼠标单击树上的节点时 , 系 统 将 通知监听器 自 动调用

TreeSelectionListener 接口中的方法 valueChanged 实施相应操作。

DefaultMutableTreeNode(ObjDefaultMutableTreeNode(Object userObj)ect userObj)

创建没有父节点和子节点、但允许有子节点的树节点,创建没有父节点和子节点、但允许有子节点的树节点,并使用指定的用户对象对它进行初始化。并使用指定的用户对象对它进行初始化。

DefaultMutableTreeNode(ObjDefaultMutableTreeNode(Object userObj, boolean child)ect userObj, boolean child)

创建没有父节点和子节点的树节点,使用指定的用户创建没有父节点和子节点的树节点,使用指定的用户对象对它进行初始化,仅在指定时才允许有子节点。对象对它进行初始化,仅在指定时才允许有子节点。

Page 72: Java 软件设计基础

School of Computer Science and Technology

–系统提供的树组件操作方法

–实例

JTree(TreeNode root)JTree(TreeNode root) 返回一个 返回一个 JTreeJTree ,指定的 ,指定的 TreeNode TreeNode 作为其根,它显示作为其根,它显示根节点。根节点。

getParent()getParent() 返回此节点的父节点,如果此节点没有父节点,则返回 返回此节点的父节点,如果此节点没有父节点,则返回 nullnull 。。

isLeaf()isLeaf() 如果此节点没有子节点,则返回 如果此节点没有子节点,则返回 truetrue 。。

getChildCount()getChildCount() 返回此节点的子节点数。返回此节点的子节点数。

setAllowsChildren(boolesetAllowsChildren(boolean b)an b)

确定是否允许此节点拥有子节点。确定是否允许此节点拥有子节点。

getUserObject()getUserObject() 返回此节点的用户对象。返回此节点的用户对象。import java.awt.*;import javax.swing.*;import javax.swing.tree.*;import javax.swing.event.*;class J TreeWin extends J Frame implements TreeSelectionListener{

J Tree tree;public J TreeWin(String s){

super(s);this.setBackground(Color.pink);Container c=getContentPane();

Page 73: Java 软件设计基础

School of Computer Science and Technology

DefaultMutableTreeNode root=new DefaultMutableTreeNode("java programming");DefaultMutableTreeNode n1=new DefaultMutableTreeNode("swing");

DefaultMutableTreeNode n11=new DefaultMutableTreeNode("Tree");DefaultMutableTreeNode n12=new DefaultMutableTreeNode("Button");

DefaultMutableTreeNode n2=new DefaultMutableTreeNode("computer network");DefaultMutableTreeNode n21=new DefaultMutableTreeNode("internet technology");

DefaultMutableTreeNode n211=new DefaultMutableTreeNode("web technology");DefaultMutableTreeNode n2111=new DefaultMutableTreeNode("HTML");DefaultMutableTreeNode n2112=new DefaultMutableTreeNode("HTTP");

DefaultMutableTreeNode n22=new DefaultMutableTreeNode("wireless network");DefaultMutableTreeNode n23=new DefaultMutableTreeNode("grid technology");

DefaultMutableTreeNode n3=new DefaultMutableTreeNode("database");DefaultMutableTreeNode n4=new DefaultMutableTreeNode("jsp");DefaultMutableTreeNode n5=new DefaultMutableTreeNode("servlet");DefaultMutableTreeNode n6=new DefaultMutableTreeNode("thread");

root.add(n1);root.add(n2);root.add(n3);root.add(n4);root.add(n5);root.add(n6);n1.add(n11);n1.add(n12);n2.add(n21);n2.add(n22);n2.add(n23);n21.add(n211);n211.add(n2111);n211.add(n2112);tree=new J Tree(root);tree.addTreeSelectionListener(this);J ScrollPane sp=new J ScrollPane(tree);c.add(sp);

Page 74: Java 软件设计基础

School of Computer Science and Technology

setDefaultCloseOperation(J Frame.EXIT_ON_CLOSE);setVisible(true);setBounds(80,80,300,300);c.validate();validate();

}public void valueChanged(TreeSelectionEvent e){

DefaultMutableTreeNode node=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();if(node.isLeaf()) this.setTitle((node.getUserObject()).toString());

}}public class J TreeEx{

public static void main(String args[]){J TreeWin win=new J TreeWin("J Tree Example");

}}

Page 75: Java 软件设计基础

School of Computer Science and Technology

• 中间容器中间容器–JPanel面板

•是一类无边框、不能移动、放大、缩小或关闭的容器。•JPanel 不是顶层容器,它是作为一个容器加入到其他顶层容器如

JFrame、 JApplet 中的。•构造方法:

•实例

JPanel()JPanel() 创建流布局的新创建流布局的新 JPanelJPanel

JPanel(LayoutManager layout)JPanel(LayoutManager layout) 创建具有指定布局管理器的新创建具有指定布局管理器的新 JPanelJPanel

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class J PanelEx extends J Frame{

public J PanelEx(){super("J Panel Example");final int SIZE=3;Container c=getContentPane();c.setLayout(new BorderLayout(30,30));J Panel jp1=new J Panel();

Page 76: Java 软件设计基础

School of Computer Science and Technology

jp1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"Button Group 0"));jp1.setLayout(new FlowLayout());for(int i=0;i<SIZE;i++) jp1.add(new J Button("boxes[0]:"+i));J Panel jp2=new J Panel();jp2.setLayout(new GridLayout(3,1));for(int i=0;i<SIZE;i++) jp2.add(new J Button("boxes[1]:"+i));J Panel jp3=new J Panel();jp3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"Button Group 2"));jp3.setLayout(new FlowLayout());for(int i=0;i<SIZE;i++) jp3.add(new J Button("boxes[2]:"+i));c.add(jp1,BorderLayout.NORTH);c.add(jp2,BorderLayout.CENTER);c.add(jp3,BorderLayout.SOUTH);setSize(350,300);show();

}public static void main(String args[]){

J PanelEx jp=new J PanelEx();jp.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){System.exit(0);

}});

}}

Page 77: Java 软件设计基础

School of Computer Science and Technology

–JScrollPane 窗格•可以将一个组件放到一个滚动窗格中,然后通过滚动条来观察这个

组件。•构造方法:

–JSplitPane 窗格•拆分窗格:可以用一条拆分线把容器分为左右或上下两个部分,每

个部分中都可以放置组件。•构造方法:

JScrollPane()JScrollPane() 创建一个空的创建一个空的 JScrollPaneJScrollPane ,需要时水平和垂直,需要时水平和垂直滚动条都可显示滚动条都可显示

JScrollPane(int v, int h)JScrollPane(int v, int h) 创建一个具有指定滚动条策略的空创建一个具有指定滚动条策略的空 JScrollPaneJScrollPane

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

JScrollPane(Component c, int v, JScrollPane(Component c, int v, int h)int h)

创建一个显示指定组件内容的创建一个显示指定组件内容的 JScrollPaneJScrollPane ,具,具有指定滚动条策略有指定滚动条策略

Page 78: Java 软件设计基础

School of Computer Science and Technology

•一般方法:

–JLayeredPane 分层窗格•可用来处理组件经常重叠的情况, JLayeredPane 可将容器分为

五层。•构造方法

•一般方法

setDividerLocation(double setDividerLocation(double position)position)

设置分隔条的位置设置分隔条的位置

JSplitPane(int s, Component c1, JSplitPane(int s, Component c1, Component c2)Component c2)

创建一个具有指定方向和指定组件的新创建一个具有指定方向和指定组件的新JSplitPaneJSplitPane

setLayer(Component c, int setLayer(Component c, int layer)layer)

设置指定组件的设置指定组件的 layerlayer 属性,使之成为该层中最底部属性,使之成为该层中最底部的组件的组件

getLayer(Component c)getLayer(Component c) 返回指定返回指定 ComponentComponent 的的 layerlayer属性属性

add(JComponent c. int add(JComponent c. int layer)layer)

添加组件并设置所在的层添加组件并设置所在的层

JLayeredPane()JLayeredPane() 创建新的创建新的 JLayeredPaneJLayeredPane

Page 79: Java 软件设计基础

School of Computer Science and Technology

•注意:–其中,参数 layer取值常量为:

»DEFAULT_LAYER(最底层,与其他层组件发生重叠时将被遮挡 )»PALETIE_LAYER»MODAL_LAYER»POPUP_LAYER»DRAG_LAYER(最上层,组件在移动中不会被遮挡,若有许多组件,鼠标移动一组件时可把移动组件放到 DRAG_LAYER层)

–若同一层上添加组件时发生重叠,先添加的会遮挡后添加的。•swing 提供两种分层面板

–JLayeredPane–JDesktopPane

»是 JLayeredPane的子类,用来容纳内部框架 (JInternalFrame)而设置。

–JToolBar 工具栏•用于显示常用工具控件的容器。用户可以拖拽出一个独立的可显示

工具控件的窗口,设置相关属性:

Page 80: Java 软件设计基础

School of Computer Science and Technology

–JToolBar.HORIZONTAL–JToolBar.VERTICAL

•构造方法:

•一般方法:

•实例

getComponentIndex(ComponegetComponentIndex(Component c)nt c)

返回指定组件的索引返回指定组件的索引

getComponentAtIndex(int i)getComponentAtIndex(int i) 返回指定索引位置的组件返回指定索引位置的组件

JToolBar()JToolBar() 创建新的工具栏;默认的方向为创建新的工具栏;默认的方向为 HORIZONTALHORIZONTAL

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class J ToolBarEx extends J Frame implements ActionListener{

J Button b1,b2,b3;J ToolBar jt;J TextArea ta;J ScrollPane sp;J Panel p;public J ToolBarEx(){

super("J ToolBar Example");addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){System.exit(0);}});

Page 81: Java 软件设计基础

School of Computer Science and Technology

b1=new J Button(new ImageIcon("1.jpg"));b1.addActionListener(this);b2=new J Button(new ImageIcon("2.jpg"));b2.addActionListener(this);b3=new J Button(new ImageIcon("3.jpg"));b3.addActionListener(this);jt=new J ToolBar();jt.add(b1);jt.add(b2);jt.add(b3);ta=new J TextArea(6,30);sp=new J ScrollPane(ta);p=new J Panel();setContentPane(p);p.setLayout(new BorderLayout());p.setPreferredSize(new Dimension(300,150));p.add(jt,BorderLayout.NORTH);p.add(sp,BorderLayout.CENTER);show();

}public void actionPerformed(ActionEvent e){

String s="";if(e.getSource()==b1) s="You have pressed button at left!Please Continue!\ n";if(e.getSource()==b2) s="You have pressed button at center!Please Continue!\ n";if(e.getSource()==b3) s="You have pressed button at right!Please Continue!\ n";ta.append(s);ta.setBackground(Color.pink);

}public static void main(String args[]){

new J ToolBarEx();}

}

Page 82: Java 软件设计基础

School of Computer Science and Technology

• 多文档界面多文档界面–Java 实现多文档界面 (MDI)常用方式是在一个 JFrame 窗口

中添加若干个被限制在 JFrame 中的内部窗体 JInternalFrame。

–在使用时需要将内部窗体事先添加到 JDesktopPane桌面容器中。一个桌面容器可以添加若干个被限制在其内的内部窗体,然后再将此桌面容器添加到 JFrame 窗体即可。

–构造方法:JDesktopPane()JDesktopPane() 创建一个新的创建一个新的 JDesktopPaneJDesktopPane

JInternalFrame()JInternalFrame() 创建不可调整大小的、不可关闭的、不可最大化的、创建不可调整大小的、不可关闭的、不可最大化的、不可图标化的、没有标题的不可图标化的、没有标题的 JInternalFrameJInternalFrame

JInternalFrame(String title, JInternalFrame(String title, boolean resizable, boolean boolean resizable, boolean closable, boolean max, closable, boolean max, boolean min)boolean min)

创建具有指定标题、可调整、可关闭、可最大化和创建具有指定标题、可调整、可关闭、可最大化和可图标化的可图标化的 JInternalFrameJInternalFrame

Page 83: Java 软件设计基础

School of Computer Science and Technology

–一般方法add(JInternalFrame c, int layer)add(JInternalFrame c, int layer) 添加内部窗体,指定内部窗体所在的层次添加内部窗体,指定内部窗体所在的层次

setLayer(JInternalFrame c, int layer)setLayer(JInternalFrame c, int layer) 设置内部窗体所在的层次设置内部窗体所在的层次

getLayer(JInternalFrame c)getLayer(JInternalFrame c) 获取内部窗体所在的层次获取内部窗体所在的层次

getAllFrames()getAllFrames() 返回桌面中当前显示的所有返回桌面中当前显示的所有 JInternalFramesJInternalFrames

getAllFramesInLayer(int layer)getAllFramesInLayer(int layer) 返回桌面指定层中当前所显示的所有返回桌面指定层中当前所显示的所有 JInternalFramesJInternalFrames

getSelectedFrame()getSelectedFrame() 返回此返回此 JDesktopPaneJDesktopPane 中当前活动的中当前活动的 JInternalFrameJInternalFrame ,,如果当前没有活动的如果当前没有活动的 JInternalFrameJInternalFrame ,则返回,则返回 nullnull

addInternalFrameListener(InternalFraaddInternalFrameListener(InternalFrameListener listener)meListener listener)

添加指定的侦听器,以从此内部窗体接收内部窗体事件添加指定的侦听器,以从此内部窗体接收内部窗体事件

setMaximizable(boolean b)setMaximizable(boolean b) 设置设置 maximizablemaximizable 属性,该属性确定是否可以通过某属性,该属性确定是否可以通过某个用户操作最大化此个用户操作最大化此 JInternalFrameJInternalFrame

setClosable(boolean b)setClosable(boolean b) 设 置 是 否 可 以 通 过 某 个 用 户 操 作 关 闭 此设 置 是 否 可 以 通 过 某 个 用 户 操 作 关 闭 此JInternalFrameJInternalFrame

setIconifiable(boolean b)setIconifiable(boolean b) 设置设置 iconableiconable属性,对于能够使属性,对于能够使 JInternalFrameJInternalFrame变成一个图标的用户而言,该属性必须为变成一个图标的用户而言,该属性必须为 truetrue

setResizable(boolean b)setResizable(boolean b) 设 置 是 否 可 以 通 过 某 个 用 户 操 作 调 整设 置 是 否 可 以 通 过 某 个 用 户 操 作 调 整JInternalFrameJInternalFrame 的大小的大小

setTitle(String title)setTitle(String title) 设置设置 JInternalFrameJInternalFrame 的标题的标题

setVisible()setVisible() 设置内部窗体可见性设置内部窗体可见性

Page 84: Java 软件设计基础

School of Computer Science and Technology

–注意:•内 部 窗 体 不 同 于 中 间 容 器 , 不 能 直 接 把 组 件 加 入 到

JInternalFrame 中,而只能加到它的内容面板 ContentPane 中。内部窗体和 JFrame 窗体一样,可以通过 getContentPane()方法得到它的内容窗体。

•为了能显示内部窗体,必须把内部窗体先添加到一个专门为内部窗体服务的 JDesktopPane 容器中。

•内部窗体需设置初始大小,内部窗体的内容面板的默认布局是BorderLayout 布局。

• JOptionPaneJOptionPane和和 JDialogJDialog 对话框对话框–对话框的模式与方法

•对话框分为模式 (Modal) 和非模式 (Non-modal) 两种。–模式对话框:对话框程序必须确认才能继续运行;–非模式对话框:显示对话框后,用户可以不用关闭此对话框就可继续

程序的运行。

Page 85: Java 软件设计基础

School of Computer Science and Technology

•构造方法:

JOptionPane()JOptionPane() 创建一个带有测试消息的创建一个带有测试消息的 JOptionPaneJOptionPane

JOptionPane(Object msg, int JOptionPane(Object msg, int msgtype)msgtype)

创建一个显示消息的创建一个显示消息的 JOptionPaneJOptionPane 的实例,的实例,使其具有指定的消息类型和默认选项使其具有指定的消息类型和默认选项

JOptionPane(Object msg, int JOptionPane(Object msg, int msgtype, int optiontype, Icon msgtype, int optiontype, Icon icon)icon)

创建一个显示消息的创建一个显示消息的 JOptionPaneJOptionPane 的实例,的实例,使其具有指定的消息类型、选项和图标使其具有指定的消息类型、选项和图标

JDialog()JDialog() 创建一个没有标题并且没有指定创建一个没有标题并且没有指定 FrameFrame 所有者所有者的无模式对话框的无模式对话框

JDialog(Dialog owner, String str)JDialog(Dialog owner, String str) 创建一个具有指定标题和指定所有者对话框的创建一个具有指定标题和指定所有者对话框的无模式对话框无模式对话框

JDialog(Dialog owner, boolean JDialog(Dialog owner, boolean model)model)

创建一个具有指定所有者 创建一个具有指定所有者 Dialog Dialog 和模式的和模式的对话框对话框

JDialog(Dialog owner, String str, JDialog(Dialog owner, String str, boolean model)boolean model)

创建一个具有指定标题、模式和指定所有者创建一个具有指定标题、模式和指定所有者DialogDialog 的对话框的对话框

Page 86: Java 软件设计基础

School of Computer Science and Technology

•静态方法

showMessageDialog(Component showMessageDialog(Component parentC, Object msg)parentC, Object msg)

调出信息为调出信息为 msgmsg消息对话框消息对话框

showMessageDialog(Component showMessageDialog(Component parentC, Object msg, String str, int parentC, Object msg, String str, int msgtype)msgtype)

调出对话框,它显示使用由调出对话框,它显示使用由 msgTypemsgType 参数确参数确定的默认图标的定的默认图标的 messagemessage

ShowConfirmDialog(Component ShowConfirmDialog(Component parentC, Object msg)parentC, Object msg)

调出带有选项调出带有选项 YesYes 、、 NoNo 和和 CancelCancel 的对话的对话框;标题为框;标题为 Select an OptionSelect an Option

ShowConfirmDialog(Component ShowConfirmDialog(Component parentC, Object msg, String str, int parentC, Object msg, String str, int optType)optType)

调出一个由 调出一个由 optType optType 参数确定其中选项数参数确定其中选项数的对话框的对话框

showInputDialog(Object msg)showInputDialog(Object msg) 显示请求用户输入的问题消息对话框显示请求用户输入的问题消息对话框

showInputDialog(Component showInputDialog(Component parentC, Object msg, String str, parentC, Object msg, String str, int msgtype)int msgtype)

显示请求用户输入内容的对话框,它以显示请求用户输入内容的对话框,它以parentCparentC 为父级,该对话框的标题为为父级,该对话框的标题为 strstr ,消,消息类型为息类型为 msgTypemsgType

Page 87: Java 软件设计基础

School of Computer Science and Technology

•一般方法:

–JOptionPane 对话框•提供了多种可供用户使用的对话框以及相应的静态方法,指定该方

法中的有关参数就可以很容易的引用 JOptionPane 类赋予的对话框。

•JOptionPane 对话框主要分为以下四种类型:–ShowMessageDialog :用于向用户显示一些信息,含有“确定

”按钮。方法中的 msgtype 可以取以下值:»JOptionPane.WARNING_MESSAGE»JOptionPane.INFORMATION_MESSAGE»JOptionPane.QUESTION_MESSAGE

setSize()setSize() 设置对话框大小设置对话框大小

setModal(boolean b)setModal(boolean b) 设置对话框模式设置对话框模式

getTitle()getTitle() 获取对话框标题获取对话框标题

setTitle(String title)setTitle(String title) 设置对话框标题设置对话框标题

setVisible(boolean b)setVisible(boolean b) 设置对话框是否可见设置对话框是否可见

Page 88: Java 软件设计基础

School of Computer Science and Technology

»JOptionPane.ERROR_MESSAGE»JOptionPane.PLAIN_MESSAGE注意:以上这些值可以确定对话框的外观。

–ShowInputDialog :用于提示用户进行数据输入,通过返回一个确认 / 否消息给系统以决定取舍。

–ShowOptionDialog :用于给出可供用户选择的对话框。–ShowConfirmDialog :用于想用户提问一个要求确认的信息,并

可得到 YES/NO/CANCEL 的响应,方法中的 msgtype 可取以下值:»JOptionPane.YES_NO_OPTION»JOptionPane.OK_CANCEL_OPTION»JOptionPane.YES_NO_CANCEL_OPTION

–当对话框消失后, showConfirmDialog 方法会返回下列整数值之一:

»JOptionPane.YES_OPTION»JOptionPane.NO_OPTION»JOptionPane.OK_OPTION»JOptionPane.CANCEL_OPTION»JOptionPane.CLOSED_OPTION

Page 89: Java 软件设计基础

School of Computer Science and Technology

•实例import java.awt.*;import java.awt.event.*;import javax.swing.*;public class J OptionPaneEx extends J Frame{

private J Button b1,b2,b3,b4;public J OptionPaneEx(){

super("J OptionPane Example");Container c=getContentPane();c.setLayout(new GridLayout(2,2,20,20));b1=new J Button("b1(Message)");c.add(b1);b1.addActionListener(new handle());b2=new J Button("b2(Question)");c.add(b2);b2.addActionListener(new handle());b3=new J Button("b3(Input)");c.add(b3);b3.addActionListener(new handle());b4=new J Button("b4(Confirm)");c.add(b4);b4.addActionListener(new handle());setSize(300,200);show();

}public class handle implements ActionListener{

public void actionPerformed(ActionEvent e){String title="Dialog";String content="Display the content of dialog";int dialogType=J OptionPane.PLAIN_MESSAGE;if(e.getSource()==b1){

title="Message";dialogType=J OptionPane.INFORMATION_MESSAGE;J OptionPane.showMessageDialog(null,content,title,dialogType);

}

Page 90: Java 软件设计基础

School of Computer Science and Technology

else if(e.getSource()==b2){title="Question";dialogType=J OptionPane.QUESTION_MESSAGE;J OptionPane.showMessageDialog(null,content,title,dialogType);

}else if(e.getSource()==b3){

title="Input";dialogType=J OptionPane.QUESTION_MESSAGE;J OptionPane.showInputDialog(null,content,title,dialogType);

}else{

title="Confirm";dialogType=J OptionPane.YES_NO_OPTION;J OptionPane.showConfirmDialog(null,content,title,dialogType);

}}

}public static void main(String args[]){

J OptionPaneEx jp=new J OptionPaneEx();}

}

Page 91: Java 软件设计基础

School of Computer Science and Technology

Page 92: Java 软件设计基础

School of Computer Science and Technology

–JDialog 对话框•如果 JOptionPane 提供的对话框无法满足我们的要求,就需要

使用 JDialog 来自行设计对话框。•JDialog 类和 JFrame 类都是 Window 的子类,两者都依赖于

某个窗口或组件,都可以将相关组件添加到内容面板 ContentPane中。当 JDialog 对话框依赖的窗口或组件消失,对话框也消失;而当它所依赖的窗口或组件可见时,对话框又会自动恢复。

•需要注意的是:–不 可 以 直 接 将 组 件 添 加 到 JDialog 对 象 中 , 而需要通 过

getContentPane 方法获得内容面板,然后将组件添加到内容面板中去;

–不可以对 JDialog 设置布局,而是为其内容面板设置布局,默认布局为 BorderLayout 。

•实例:import java.awt.*;import java.awt.event.*;import javax.swing.*;

Page 93: Java 软件设计基础

School of Computer Science and Technology

public class J DialogEx extends J Frame{J Label l1=new J Label("please click yes or no button");J Label l2=new J Label(" ");J Button b1=new J Button("display J Dialog");J Button b2=new J Button("yes");J Button b3=new J Button("no");private J Dialog jd=new J Dialog();private J Frame jf;public J DialogEx(){

super("J Dialog Example");jf=new J Frame("J Dialog");Container c=getContentPane();c.setBackground(Color.orange);c.setLayout(new GridLayout(2,1,20,20));c.add(b1);c.add(l2);Container d1=jd.getContentPane();d1.setLayout(new FlowLayout());d1.add(l1);d1.add(b2);d1.add(b3);b1.addActionListener(new handle());b2.addActionListener(new handle());b3.addActionListener(new handle());setSize(200,150);setVisible(true);

}

Page 94: Java 软件设计基础

School of Computer Science and Technology

public class handle implements ActionListener{public void actionPerformed(ActionEvent e){

if(e.getSource()==b1){jd.setBounds(150,150,200,150);jd.show();

}else if(e.getSource()==b2){

jd.hide();l2.setText("You have selected yes button");

}else{

jd.hide();l2.setText("You have selected no button");

}}

}public static void main(String args[]){

J DialogEx jde = new J DialogEx();}

}

Page 95: Java 软件设计基础

School of Computer Science and Technology

多媒体程序设计

• JavaJava屏幕坐标系屏幕坐标系–单位:像素

• GraphicsGraphics主要方法主要方法

(80,50)

(80,0)

(0,50)

(0,0)

draw3DRect(int x, int y, int w, draw3DRect(int x, int y, int w, int h, boolean raised)int h, boolean raised)

绘制以绘制以 (x,y)(x,y) 为起点宽高为为起点宽高为 ww 和和 hh 的的 3D3D 矩形,矩形,当当 raisedraised 为为 truetrue 时时 3D3D 效果为凸效果为凸

fill3DRect(int x, int y, int w, int fill3DRect(int x, int y, int w, int h, boolean raised)h, boolean raised)

填充以填充以 (x,y)(x,y) 为起点宽高为为起点宽高为 ww 和和 hh 的的 3D3D 矩形,矩形,当当 raisedraised 为为 truetrue 时时 3D3D 效果为凸效果为凸

drawLine(int x1, int y1, int x2, drawLine(int x1, int y1, int x2, int y2)int y2)

画点画点 (x1,y1)(x1,y1) 和点和点 (x2,y2)(x2,y2) 之间的直线之间的直线

drawRect(int x, int y, int w, int drawRect(int x, int y, int w, int h)h)

绘制以绘制以 (x,y)(x,y) 为起点宽高为为起点宽高为 ww 和和 hh 的矩形的矩形

Page 96: Java 软件设计基础

School of Computer Science and Technology

fillRect(int x, int y, int w, int fillRect(int x, int y, int w, int h)h)

填充以填充以 (x,y)(x,y) 为起点宽高为为起点宽高为 ww 和和 hh 的矩形的矩形

clearRect(int x, int y, int w, clearRect(int x, int y, int w, int h)int h)

以背景色填充以以背景色填充以 (x,y)(x,y) 为起点宽高为为起点宽高为 ww 和和 hh 的矩的矩形形

drawRoundRect(int x, int y, drawRoundRect(int x, int y, int w, int h, int arcW, int int w, int h, int arcW, int arcH)arcH)

绘制以绘制以 (x,y)(x,y) 为起点宽高为为起点宽高为 ww 和和 hh 的圆角矩形,的圆角矩形,四个圆角的宽度为四个圆角的宽度为 arcWarcW ,高度为,高度为 arcHarcH

fillRoundRect(int x, int y, int fillRoundRect(int x, int y, int w, int h, int arcW, int arcH)w, int h, int arcW, int arcH)

填充以填充以 (x,y)(x,y) 为起点宽高为为起点宽高为 ww 和和 hh 的圆角矩形,的圆角矩形,四个圆角的宽度为四个圆角的宽度为 arcWarcW ,高度为,高度为 arcHarcH

drawOval(int x, int y, int w, drawOval(int x, int y, int w, int h)int h)

以以 (x,y)(x,y) 为起点、按宽高为为起点、按宽高为 ww 和和 hh 的外接矩形绘的外接矩形绘制椭圆制椭圆

fillOval(int x, int y, int w, int fillOval(int x, int y, int w, int h)h)

以以 (x,y)(x,y) 为起点、按宽高为为起点、按宽高为 ww 和和 hh 的外接矩形填的外接矩形填充椭圆充椭圆

drawArc(int x, int y, int h, int drawArc(int x, int y, int h, int sAng, int arcAng)sAng, int arcAng)

以以 sAngsAng 为起始角,为起始角, arcAngarcAng 为张角画圆弧或扇形,为张角画圆弧或扇形,逆时针为正逆时针为正

fillArc(int x, int y, int h, int fillArc(int x, int y, int h, int sAng, int arcAng)sAng, int arcAng)

以以 sAngsAng 为起始角,为起始角, arcAngarcAng 为张角填充圆弧或扇为张角填充圆弧或扇形,顺时针为负形,顺时针为负

drawPolygon(int x[ ], int y[ ], drawPolygon(int x[ ], int y[ ], int points)int points)

按照按照 x[]x[] 和和 y[]y[] 数组为定点绘制封闭的数组为定点绘制封闭的 pointspoints 边边形形

fillPolygon(int x[ ], int y[ ], int fillPolygon(int x[ ], int y[ ], int points)points)

按照按照 x[]x[] 和和 y[]y[] 数组为定点填充封闭的数组为定点填充封闭的 pointspoints 边边形形

Page 97: Java 软件设计基础

School of Computer Science and Technology

• 图形处理图形处理–利用 Graphics 类提供的方法绘制图形

•绘制直线•绘制矩形•绘制圆角矩形•绘制 3D矩形•绘制椭圆•绘制圆弧和扇形•绘制多边形•颜色

Color(int r, int g, int b)Color(int r, int g, int b) 创建具有指定红绿蓝值的不透明创建具有指定红绿蓝值的不透明 sRGBsRGB 颜色,值范围为颜色,值范围为 0-0-255255

Color(float r, float g, Color(float r, float g, float b)float b)

创建具有指定红绿蓝值的不透明创建具有指定红绿蓝值的不透明 sRGBsRGB颜色,值范围为颜色,值范围为 0.0-0.0-1.01.0

Color(int rgb)Color(int rgb) 创建具有指定组合的创建具有指定组合的 RGBRGB 值的不透明的值的不透明的 sRGB sRGB 颜色,此 颜色,此 sRGB sRGB 值的值的 16-2316-23 位表示红色分量,位表示红色分量, 8-158-15 位表示绿色分量,位表示绿色分量,0-70-7 位表示蓝色分量位表示蓝色分量

Page 98: Java 软件设计基础

School of Computer Science and Technology

–此外还有系统定义的 13 中颜色常量:»WHITE / RED / GREEN / BLUE / GRAY / YELLOW / CYAN / BLACK / MAGENTA / PINK / DARKGRAY / LIGHTGRAY / ORANGE

•文本字体设置

–直接导入图形文件进行处理•声明 Image 类型的变量

–通过 java.awt 下 Component 类的 createImage() 方法完成。

Font(String name, int style, Font(String name, int style, int size)int size)

根据指定名称、样式和磅值大小,创建一个新根据指定名称、样式和磅值大小,创建一个新 FontFont

setFont(Font font)setFont(Font font) 设置字体设置字体

getFont()getFont() 获取字体对象获取字体对象

getName()getName() 获取字体的逻辑名字获取字体的逻辑名字

getStyle()getStyle() 获取字体字型获取字体字型

getSize()getSize() 获取字体大小获取字体大小

Image Image createImage(ImageProducer img)createImage(ImageProducer img)

使用指定的图像生成器创建一幅图像使用指定的图像生成器创建一幅图像

Image createImage(int w, int h)Image createImage(int w, int h) 返回具有返回具有 ww 宽宽 hh 高的空图像高的空图像

Page 99: Java 软件设计基础

School of Computer Science and Technology

–java.awt.image 包中提供类 MemoryImageSource适用于在内存中生成一幅图像。

•使用 getImage() 加载图像

•使用 drawImage()绘制图像

MemoryImageSource(int w, int h, MemoryImageSource(int w, int h, int pix[ ], int start, int scan)int pix[ ], int start, int scan)

在内存中生成一幅图像,其中在内存中生成一幅图像,其中 pix[]pix[] 代表图代表图像每一 点颜色 值 ,像每一 点颜色 值 , startstart 代 表起始位代 表起始位置,置, scanscan 代表图像扫描线宽度代表图像扫描线宽度

getImage(URL url)getImage(URL url) 获取获取 urlurl 中的图像中的图像

getImage(URL url, String name)getImage(URL url, String name) 获取指定获取指定 urlurl 下文件下文件 namename 中的图像中的图像

getImage(URL url)getImage(URL url) 获取获取 urlurl 中的图像中的图像

getImage(String filename)getImage(String filename) 获取指定获取指定 urlurl 下文件下文件 filenamefilename 中的图像中的图像

drawImage(Image img, int x, int y, drawImage(Image img, int x, int y, ImageObserver obs)ImageObserver obs)

绘制指定图像中当前可用的图像绘制指定图像中当前可用的图像

drawImage(Image img, int x, int y, drawImage(Image img, int x, int y, int w, int h, Color bg, int w, int h, Color bg, ImageObserver obs)ImageObserver obs)

绘制指定图像中当前可用的图像,其中绘制指定图像中当前可用的图像,其中 bgbg 是是在图像非透明部分下绘制的背景色在图像非透明部分下绘制的背景色

Page 100: Java 软件设计基础

School of Computer Science and Technology

•图像的缩放–当 drawImage语句和原来图片显示的宽 /高度不一样时,系统就自

动进行缩放处理。•图像旋转与透明处理

–awt 包中提供了一个二维增强图像类 Graphics2D ,能够对图像及文本进行旋转、透明等处理。

–以 2D 方式进行处理,需要将绘图区转换为 Graphics2d 类型,然后调用其方法完成;

–绘制透明图像时,需要设定图形交叉区的颜色合成模式,该模式由AlphaComposite 类生成,并由 Graphics2D 类设定。

• 声音处理声音处理–简单方式

•其中 url 表示声音文件 的 位 置 , 一 般 用 getCodeBase() 或getDocumentBase()代表。

play(URL url)play(URL url) 播放指定播放指定 urlurl 的声音的声音

play(URL url, String name)play(URL url, String name) 播放指定播放指定 urlurl 下声音文件下声音文件 namename 的声音的声音

Page 101: Java 软件设计基础

School of Computer Science and Technology

–可控制声音的播放•获取 AudioClip 对象:

•AudioClip 提供的三个方法:–play() :从头开始播放声音,只播放一次;–loop() :循环播放–stop() :停止当前正在播放的声音

getAudioClip(URL url)getAudioClip(URL url) 从从 urlurl 获取获取 AudioClipAudioClip 对象对象

getAudioClip(URL url, String getAudioClip(URL url, String name)name)

从从 urlurl 下声音文件下声音文件 namename 获取获取 AudioClipAudioClip 对象对象

Page 102: Java 软件设计基础

School of Computer Science and Technology

总结

创建继承自Jframe的类……getContentPane()大小、背景……

step1.声明和创建我的窗口 step2.根据功能声明并排放组件

Button

TextFieldLabel

Menu

……

button.addActionListener()textfield.addActionListener()…………

step3.哪些组件需要与用户交互

actionPerformed()valueChanged()…………

step4.交互时应用程序作何响应