104
1 第第第 Swing 第第第第第第第第第第 第第第第第第 第第第第第 第第第 [email protected] http://211.155.231.249:8009

第八章 Swing 图形用户界面程序设计

Embed Size (px)

DESCRIPTION

第八章 Swing 图形用户界面程序设计. 浙江工业大学 计算机学院 赵小敏 [email protected] http://211.155.231.249:8009. 主要内容. 简介 容器组件 基本组件 布局管理器 事件处理模型 高级图像用户界面. 8.1 简介. 图形用户界面 (GUI) 数据的图形显示形式 友好的交互方式 简化计算机软件的学习过程 GUI 示例 jdk1.6\demo\jfc\SwingSet2 GUI 组件 : Labels , Text fields , Buttons 等等. - PowerPoint PPT Presentation

Citation preview

Page 1: 第八章   Swing 图形用户界面程序设计

1

第八章 Swing 图形用户界面程序设计

浙江工业大学 计算机学院赵小敏[email protected]://211.155.231.249:8009

Page 2: 第八章   Swing 图形用户界面程序设计

2

主要内容 简介 容器组件 基本组件 布局管理器 事件处理模型 高级图像用户界面

Page 3: 第八章   Swing 图形用户界面程序设计

3

8.1 简介

图形用户界面 (GUI) 数据的图形显示形式 友好的交互方式 简化计算机软件的学习过程 GUI 示例

jdk1.6\demo\jfc\SwingSet2 GUI 组件 : Labels, Text fields, Buttons 等等

Page 4: 第八章   Swing 图形用户界面程序设计

4

1 、关于 Swing GUI 组件

Swing GUI 组件 所在的包 : javax.swing Swing 组件的平台相关性较小 (lightweight)

早期版本的 GUI 组件 所在的包 : java.awt 与平台相关性较强

Page 5: 第八章   Swing 图形用户界面程序设计

5

2 、 Swing 特性1. 100% 的纯 Java 实现2. 可插入的外观感觉( Pluggable Look and Feel ,

PL&F )3. Swing 组件的多样化4. 支持键盘操作5. 设置边框6. 使用图标( Icon )7. 可存取性支持 8. MVC(Model-View-Control) 体系结构

Page 6: 第八章   Swing 图形用户界面程序设计

6

3 、 Swing 的组件 在 javax.swing 包中,定义了两种类型的组件:容器和

组件。 容器

各种组件必须放在容器 容器本身也是一种组件 分类

顶层容器 , 如 JFrame , JApplet , JDialog 和 JWindow 其它容器 , 如 JPanel,JScrollPane,JSplitPane,JToolBar

组件 基本控制组件 , 如 JButton, JComboBox, JList, JMenu,

JSlider, JTextField 不可编辑的信息显示组件,如 JLabel, JProgressBar,

JToolTip 可编辑的信息显示组件,如 JColorChooser, JFileChooser,

JTable, JTextArea

Page 7: 第八章   Swing 图形用户界面程序设计

7

4 、 Swing 的类层次结构

Swing 的类层次结构 java.awt.Component

|——java.awt.Container     —— java.awt.Window       —— java.awt.Frame — javax.swing.JFrame       —— javax.Dialog — javax.swing.JDialog       —— javax.swing.JWindow     —— java.awt.Applet-javax.swing.JApplet     —— javax.swing.Box     —— javax.swing.JComponet

Page 8: 第八章   Swing 图形用户界面程序设计

8

5 、 JComponent 类的功能

1) 边框设置:使用 setBorder() 方法可以设置组件外围的边框,使用一个 EmptyBorder 对象能在组件周围留出空白。

2) 双缓冲区:使用双缓冲技术能改进频繁变化的组件的显示效果。与 AWT 组件不同, JComponent 组件默认双缓冲区,不必自己重写代码。

3) 提示信息:使用 setTooltipText() 方法,为组件设置对用户有帮助的提示信息。

Page 9: 第八章   Swing 图形用户界面程序设计

9

5 、 JComponent 类的功能( 续 )4) 键盘导航:使用 registerKeyboardAction( ) 方法,

能使用户用键盘代替鼠标来驱动组件。 JComponent 类的子类 AbstractButton 还提供了 setMnemonic( ) 方法指明一个字符,通过这个字符和一个当前 L&F 的特殊修饰共同激活按钮动作。

5) 可插入 L&F :每个 JComponent 对象有一个相应的 ComponentUI 对象,为它完成所有的绘画、事件处理、决定尺寸大小等工作。 ComponentUI 对象依赖当前使用的 L&F, 用UIManager.setLookAndFeel( ) 方法可以设置需要的 L&F 。

6) 支持布局:通过设置组件最大、最小、推荐尺寸的方法和设置 X 、 Y 对齐参数值的方法能指定布局管理器的约束条件,为布局提供支持。

Page 10: 第八章   Swing 图形用户界面程序设计

10

8.2 容器组件

JFrame JPanel JScrollPane JSplitPane

Page 11: 第八章   Swing 图形用户界面程序设计

11

1 、 JFrame (框架) 类 JFrame 是 java.awt.Frame 的子类 在 Swing 的组件中 , JFrame 并不全是由 Java 编写的

是一种与平台关系比较密切的组件 (Heavyweight component)

java.lang.Object | +--java.awt.Component | +--java.awt.Container | +--java.awt.Window | +--java.awt.Frame | +--javax.swing.JFrame

Page 12: 第八章   Swing 图形用户界面程序设计

12

例 1 :基于 AWT 实现的框架界面

1. import java.awt.*;2. public class FrameDemo{3. Frame f;4. Button b;5. public FrameDemo(){6. f=new Frame("Frame Demo");7. b=new Button("Press me");8. f.add(b);9. f.setSize(200,200);10. f.setVisible(true);11. }12. public static void main(String args[]){13. new FrameDemo();14. }15. }

Page 13: 第八章   Swing 图形用户界面程序设计

13

例 2 :基于 Swing 实现的框架界面1. import java.awt.*;2. import javax.swing.*;3. public class JFrameDemo{4. JFrame f;5. JButton b;6. Container c;7. public JFrameDemo(){8. f=new JFrame("JFrame Demo");9. b=new JButton("Press me");10. c=f.getContentPane();11. c.add(b);12. f.setSize(200,200);13. f.setVisible(true);14. }15. public static void main(String args[]){16. new JFrameDemo();17. }18. }

Page 14: 第八章   Swing 图形用户界面程序设计

14

在 JFrame 中加入组件的方法

1) 用 getContentPane( ) 方法获得 JFrame 的内容面板,再对其加入组件:

Container c=frame.getContentPane() c.add(childComponent)

2) 建立一个 JPanel 或 JDesktopPane 之类的中间容器,把组件添加到容器中,用 setContentPane() 方法把该容器置为 JFrame 的内容面板:JPanel contentPane=new JPanel( );……// 把其它组件添加到 Jpanel 中 ;frame.setContentPane(contentPane); // 把 contentPane 对象设置成为 frame 的内容面板

Page 15: 第八章   Swing 图形用户界面程序设计

15

2 、 JPanel( 面板 )

一种中间容器,用来组成其它组件 可以添加各种组件 ( 包括面板组件 )

面板 (JPanel) 的大小由它所包含的组件决定 当组件个数增加,面板 (JPanel) 也会随之而增大

Page 16: 第八章   Swing 图形用户界面程序设计

16

例 3 :利用 JPanel 创建界面1. import java.awt.*;2. import javax.swing.*;3. public class JPanelDemo extends JFrame{4. public JPanel getGUI(){5. JPanel p=new JPanel();6. p.add(new JButton("Press me"));7. return p;8. }9. public JPanelDemo(){10. super("JPanel Demo");11. setContentPane(getGUI());12. setSize(200,200);13. setVisible(true);14. }15. public static void main(String args[]){16. new JPanelDemo();17. }18. }

1. import java.awt.*;

2. import javax.swing.*;

3. public class JPanelDemo extends JFrame{

4. public JPanel getGUI(){

5. JPanel p=new JPanel();

6. p.add(new JButton("Press me"));

7. return p;

8. }

9. public static void main(String args[]){

10. JPanelDemo jp=new JPanelDemo();

11. jp.setTitle("JPanel Demo");

12.

jp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

13. jp.setContentPane(jp.getGUI());

14. jp.setSize(200,200);

15. jp.setVisible(true);

16. }

17. }

Page 17: 第八章   Swing 图形用户界面程序设计

17

3 、 JScrollPane( 滚动窗口面板 ) JScrollPane 是带滚动条的面板,主要是通过移动

JViewport( 视口 ) 来实现的。 JViewport 是一种特殊的对象,用于查看基层组件,滚动

条实际就是沿着组件移动视口,同时描绘出它在下面 " 看到 " 的内容。

Page 18: 第八章   Swing 图形用户界面程序设计

18

滚动窗口 (JScrollPane) 效果图

Page 19: 第八章   Swing 图形用户界面程序设计

19

4 、 JSplitPane (分隔板)

JSplitPane 提供可拆分窗口,支持水平拆分(JSplitPane.HORIZONTAL_SPLIT) 和垂直(JSplitPane.VERTICAL_SPLIT) 拆分并带有滑动条。

常用方法有 :JSplitPane (int newOrientation, Component newLeftComponent, Component newRightComponent)   创建一个具有指定方向和指定组件的新 JSplitPane 。

addImpl(Component comp,Object constraints,int index)//增加指定的组件setTopComponent(Component comp) // 设置顶部的组件setDividerSize(int newSize) // 设置拆分的大小setUI(SplitPaneUI ui) // 设置外观和感觉

Page 20: 第八章   Swing 图形用户界面程序设计

20

分隔板( JSplitPane) 效果图

Page 21: 第八章   Swing 图形用户界面程序设计

21

8.3 基本组件

标签 (JLabel) 文本框 (JTextField) 按钮 (JButton) 组合框 (JComboBox) 文本 (JTextArea) 列表 JList(单选列表和多选列表 )

Page 22: 第八章   Swing 图形用户界面程序设计

22

1 、标签 (JLabel)

标签 为 GUI 提供文本 ( 主要 )或图像 ( 也可以 ) 信息 对应类 (JLabel) (JComponent 的子类 ) 可以显示 :

单行的只读的文本信息 图像 同时显示文本与图像信息

程序一般不修改标签的内容

Page 23: 第八章   Swing 图形用户界面程序设计

23

例 4 : JLabel 的演示例子1. import java.awt.Container;2. import java.awt.FlowLayout;3. import javax.swing.ImageIcon;4. import javax.swing.JFrame;5. import javax.swing.JLabel;

6. public class JLabelDemo extends JFrame{7. public JLabelDemo( ){8. super( " 框架和标签例程 " );9. String [ ] s = {"文本标签 ", "文字在图标的左侧 ", "文字在图标的下

方 "};10. ImageIcon [ ] ic = {null, new ImageIcon( "img1.gif" ),11. new ImageIcon( "img2.gif" )};12. int [ ] ih = {0, JLabel.LEFT, JLabel.CENTER};13. int [ ] iv = {0, JLabel.CENTER, JLabel.BOTTOM};14. Container c = getContentPane( );15. c.setLayout( new FlowLayout(FlowLayout.LEFT) );

Page 24: 第八章   Swing 图形用户界面程序设计

24

例 4 : JLabel 的演示例子(续)⑯ for (int i=0; i<3; i++){⑰ JLabel aLabel = new JLabel( s[i] , ic[i], JLabel.LEFT);⑱ if (i>0){⑲ aLabel.setHorizontalTextPosition(ih[i]);⑳ aLabel.setVerticalTextPosition(iv[i]);㉑ } ㉒ aLabel.setToolTipText( " 第 " + (i+1) + " 个标签 ");㉓ c.add( aLabel );㉔ } ㉕ }㉖ public static void main(String args[ ]){㉗ JLabelDemo app = new JLabelDemo( );㉘ app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);㉙ app.setSize( 360, 150 );㉚ app.setVisible( true );㉛ } ㉜ }

Page 25: 第八章   Swing 图形用户界面程序设计

25

2 、文本框 (JTextField)

显示单行的文本信息 JTextField extends JTextComponent 密码输入框 JPasswordField

Page 26: 第八章   Swing 图形用户界面程序设计

26

例 5 : JTextField 的演示例子1. import java.awt.Container;2. import java.awt.FlowLayout;3. import javax.swing.JFrame;4. import javax.swing.JPasswordField;5. import javax.swing.JTextField;

6. public class JTextFieldDemo{7. public static void main(String args[ ]){8. JFrame app = new JFrame( "文本编辑框例程 " );9. app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);10. app.setSize( 320, 120 );11. Container c = app.getContentPane( );12. c.setLayout( new FlowLayout( ) );13. JTextField [ ] t = {14. new JTextField("正常文本 :", 8), new JTextField(" 显示 ", 15),15. new JTextField(" 密码文本 :", 8), new JPasswordField("隐藏 ", 15)};16. t[0].setEditable( false );17. t[2].setEditable( false );18. for (int i=0; i<4; i++)19. c.add( t[i] );20. app.setVisible( true );21. }22. }

Page 27: 第八章   Swing 图形用户界面程序设计

27

3 、按钮 (JButton)

当鼠标左键单击按钮组件时,能触发特定的事件

在 Java 中 , 广义的按钮包括 : 命令式按钮 (JButton) 复选框 (JCheckBox) 单选按钮 (JRadioButton)

Page 28: 第八章   Swing 图形用户界面程序设计

28

按钮类的层次结构

javax.swing.JComponent

javax.swing.AbstractButton

javax.swing.JButton javax.swing. JToggleButton

javax.swing.JCheckBox javax.swing.JRadioButton

Page 29: 第八章   Swing 图形用户界面程序设计

29

1. ……2. Container c = getContentPane( );3. c.setLayout( new FlowLayout( ) );4. int i;5. ImageIcon [ ] ic = {new ImageIcon("left.gif"),6. new ImageIcon("right.gif")};7. JButton [ ] b = {new JButton(" 左 ", ic[0]), new JButton(" 中间 "),8. new JButton(" 右 ", ic[1])};9. for (i=0; i < b.length; i++)10. c.add( b[i] );

11. JCheckBox [ ] ck = {new JCheckBox(" 左 "), new JCheckBox(" 右 ")};12. for (i=0; i<ck.length; i++){13. c.add( ck[i] );14. ck[i].setSelected(true);15. }

16. JRadioButton[ ] r={new JRadioButton(" 左 "), new JRadioButton(" 右 ")};17. ButtonGroup rg = new ButtonGroup( );18. for (i=0; i < r.length; i++){19. c.add( r[i] );20. rg.add( r[i] );21. } 22. r[0].setSelected(true);23. r[1].setSelected(false);24. ……

Page 30: 第八章   Swing 图形用户界面程序设计

30

4 、组合框 (JComboBox)

组合框 (JComboBox) 可以从下拉式的列表框中选取其中的列表项 有时也称为下拉框 (drop-down list)

类 JComboBox 中的方法 getSelectedIndex( )

返回当前被选中的项 setMaximumRowCount( n )

设置最多显示列表项的项数 滚动条 (Scrollbar) 会自动加上

Page 31: 第八章   Swing 图形用户界面程序设计

31

5 、文本 (JTextArea)

JTextArea 是一个显示纯文本的多行区域。 JTextArea 不管理滚动,可把它放置在 JScrollPane

的 ViewPort 中实现滚动,如: JTextArea textArea = new JTextArea(); JScrollPane area=new JScrollPane(textArea); TextArea 具有换行能力 ,JTextArea 默认为不换行,

需设置换行策略,如: textArea.setLineWrap(true); textArea.setWrapStyleWord(true);

Page 32: 第八章   Swing 图形用户界面程序设计

32

JTextArea 的代码段1. …… 2. //建立容纳文本区的面板3. JPanel textPanel = new JPanel();

4. //新建无回绕的文本区,行数为 5 ,列数为 205. noWrapArea = new JTextArea("nowrap", 5, 20);6. //新建有回绕的文本区,行数为 5 ,列数为 207. wrapArea = new JTextArea("wraparea", 5, 20);8. wrapArea.setLineWrap(true);9. //新建带滚动条的文本区,行数为 5 ,列数为 2010. scrollArea = new JTextArea("scrollarea", 5, 20);11. //将文本区插入到滚动窗格中12. JScrollPane scrollPane = new

JScrollPane(scrollArea);

13. textPanel.add(noWrapArea);14. textPanel.add(wrapArea);15. //将滚动窗格加入到框架中16. textPanel.add(scrollPane);17. ……

Page 33: 第八章   Swing 图形用户界面程序设计

33

6 、列表 JList

JList 显示出一系列选项,用户可以从中选择一个或多项。

1. String colorNames[] ={ “Black”, “Blue”, “Cyan”, “Dark Gray”, “Gray“};

2. colorList = new JList( colorNames );3. colorList.setVisibleRowCount( 5 );4. colorList.setSelectionMode(ListSelectionModel.SINGLE

_SELECTION );

5. colorList.getSelectedIndex() ;6. colorList.getSelectedValue() ;

Page 34: 第八章   Swing 图形用户界面程序设计

34

多选列表

在 JList 中选择多个选项,方法是按住 shift 键或 ctrl 键。

多选列表没有和多个选择相关的事件。通常由另一个 GUI 组件生成的事件(外部事件)来指定处理 JList 中的多个选择。

Page 35: 第八章   Swing 图形用户界面程序设计

35

多选列表的使用方法

1. String colorNames[] ={ “Black”, “Blue”, “Cyan”, “Dark Gray”, “Gray“};

2. JList colorList = new JList( colorNames );

3. colorList.setVisibleRowCount( 5 );

4. colorList.setFixedCellHeight( 15 );

5. colorList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );

6. colorList.getSelectedValues()

Page 36: 第八章   Swing 图形用户界面程序设计

36

8.4 布局管理器

用来控制组件在容器中的布局方式 应当尽量利用已有的基本布局方式 布局管理器处理组件布局的大部分细节

Page 37: 第八章   Swing 图形用户界面程序设计

37

布局管理器

1. 流式布局 FlowLayout

2. 边界布局 BorderLayout

3. 盒式布局管理器 BoxLayout

4. 网格布局 GridLayout

5. 卡片布局 CardLayout

6. 网格包布局 GridBagLayout

Page 38: 第八章   Swing 图形用户界面程序设计

38

1 、流式布局 FlowLayout

是一种最基本的布局管理器 是 java.awt.Applet 、 java.awt.Panel 和

javax.swing.JPanel 的默认布局方式 在容器中,从左到右依次放置 GUI 组件 当组件排到容器一行的末尾时,则从下一行开始接着排列组件

每行组件的对齐方式可以是 : 左对齐、中间( 默认对齐方式 ) 和右对齐

Page 39: 第八章   Swing 图形用户界面程序设计

39

FlowLayout 的构造方法

1. public FlowLayout()

2. public FlowLayout(int alignment)

3. public FlowLayout(int alignment,int horizontalGap,int verticalGap)

alignment 参数的值必须是 FlowLayout.LEFT 、 Flowlayout.CENTER 或 FlowLayout.RIGHT 。

horizontalGap 和 verticalGap 参数指定了组件间隔距离 ( 以像素为单位 ) 。 FlowLayout 的默认间隔值为 5 。

Page 40: 第八章   Swing 图形用户界面程序设计

40

例 6 : FlowLayout 的使用方法1. import java.awt.*;2. import javax.swing.*;3. public class FlowLayoutDemo extends JFrame { 4. public FlowLayoutDemo() {5. Container c=getContentPane();6. c.setLayout(new FlowLayout());7. c.add(new JLabel("Buttons:"));8. c.add(new JButton("Button 1"));9. c.add(new JButton("2"));10. c.add(new JButton("Button 3"));11. c.add(new JButton("Long-Named Button 4"));12. c.add(new JButton("Button 5")); 13. }14. public static void main(String args[]) {15. FlowLayoutDemo window = new FlowLayoutDemo();16. window.setTitle("FlowLayout Demo");17. window.pack();// 窗口大小设置为适合组件最佳尺寸与布局所需的空间18. window.setVisible(true);19. }20. }

Page 41: 第八章   Swing 图形用户界面程序设计

41

2 、边界布局 BorderLayout

是容器 JFrame 和 JApplet 的默认布局方式 将容器分成五个区域,

NORTH ( 顶部 ) SOUTH (底部 ) WEST (左侧 ) EAST (右侧 ) CENTER ( 中间 )

每个区域最多只能 1 个组件

Page 42: 第八章   Swing 图形用户界面程序设计

42

BorderLayout 的方法

构造方法:1. BorderLayout() 构造一个组件之间没有间距的新边界布局。 2. BorderLayout(int hgap, int vgap) 用指定的组件之间的水平间距构造一个边界布局。 将组件添加到 BorderLayout 布局的容器中的方法1. add(new Button(" South "), BorderLayout.SOUTH); 2. add(new Button("South"),"South");3. add("South",new Button("South"));

Page 43: 第八章   Swing 图形用户界面程序设计

43

例 7 : BorderLayout 的使用方法1. import java.awt.*;2. import javax.swing.*;3. public class BorderLayoutDemo extends JFrame { 4. public BorderLayoutDemo() {5. Container c=getContentPane();6. c.setLayout(new BorderLayout(5,5)); 7. c.add(new JButton("North"), "North"); 8. c.add( new JButton("South"),"South");9. //c.add("South",new Button("South"));10. //c.add(new Button(" South "), BorderLayout.SOUTH); 11. c.add( new JButton("East"),"East");12. c.add( new JButton("West"),"West");13. c.add( new JButton("Center"),"Center");14. }15. public static void main(String args[]) {16. BorderLayoutDemo window = new BorderLayoutDemo(); 17. window.setTitle("BorderLayout Demo");18. window.pack();19. window.setVisible(true);20. }21. }

Page 44: 第八章   Swing 图形用户界面程序设计

44

3 、盒式布局管理器 BoxLayout

允许多个组件在容器中沿水平方向或竖直方向排列

容器的大小发生变化时,组件占用的空间不会发生变化

Page 45: 第八章   Swing 图形用户界面程序设计

45

BoxLayout 的方法

构造方法: BoxLayout(Container target, int axis)

创建一个将沿给定轴放置组件的布局管理器。 轴的方向: BoxLayout.X_AXIS: 指定组件应该从左到右放置

BoxLayout.Y_AXIS: 指定组件应该从上到下放置

Page 46: 第八章   Swing 图形用户界面程序设计

46

例 8 : BoxLayout 使用的例子1. import java.awt.Container;2. import javax.swing.BoxLayout;3. import javax.swing.JButton;4. import javax.swing.JFrame;5. public class BoxLayoutDemo{6. public static void main(String args[ ]){7. JFrame app = new JFrame( "盒式布局管理器例程 " );8. app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);9. app.setSize( 220, 130 );10. Container c = app.getContentPane( );11. c.setLayout( new BoxLayout( c, BoxLayout.X_AXIS ) );12. String s;13. JButton b;14. for (int i=0; i<3; i++){15. s = " 按钮 " + (i+1);16. b = new JButton( s );17. c.add( b );18. } 19. app.setVisible( true );20. } 21. }

Page 47: 第八章   Swing 图形用户界面程序设计

47

4 、网格布局 GridLayout

布局管理器 GridLayout 按行与列将容器等分成网格 每个组件占用具有相同宽度和高度的网格 添加组件占用网格的顺序 : 从上到下,从左到右 当一行满了,则继续到下一行,仍然是从左到右

Page 48: 第八章   Swing 图形用户界面程序设计

48

GridLayout 类的构造方法

1. GridLayout() 创建默认值的网格布局,即每个组件占据一行一列。

2. GridLayout(int rows, int cols) 创建具有指定行数和列数的网格布局

3. GridLayout(int rows, int cols, int hgap, int vgap) 创建具有指定行数和列数的网格布局。

Page 49: 第八章   Swing 图形用户界面程序设计

49

例 9 : GridLayout 的使用方法1. import java.awt.*;2. import javax.swing.*;3. public class GridLayoutDemo {4. JFrame f;5. public GridLayoutDemo(String str){6. f=new JFrame(str);7. Container c=f.getContentPane();8. c.setLayout(new GridLayout(3,2));9. for(int i=1;i<=6;i++){10. c.add(new JButton(i+""));11. }12. f.pack( ) ;13. f.setVisible(true);14. }15. public static void main(String args[]){16. new GridLayoutDemo("GridLayout Demo"); 17. }18. }

Page 50: 第八章   Swing 图形用户界面程序设计

50

5 、卡片布局管理器CardLayout CardLayout 的布局方式有点象码“扑克牌” 一个组件压在另一个组件的上面,所以每次一般只能看到一个组件

Page 51: 第八章   Swing 图形用户界面程序设计

51

6 、网格包布局GridBagLayout

GridBagLayout 是 AWT 包中提供的最灵活、最复杂的布局管理器。

GridBagLayout将组件以多行多列放置,允许指定的组件跨多行或多列。

每个 GridBagLayout 对象保留一个动态的矩形单元网格,每个组件占用一个或多个单元,称为它的显示区域。

每个由一个网格元包布局管理的组件都与一个 GridBagConstraints 的实例相关,它指定了组件在它的显示区域是如何放置的。

Page 52: 第八章   Swing 图形用户界面程序设计

52

使用布局管理器的基本规则

(1)若组件尽量充满容器空间,可以考虑使用BorderLayout 和 GridBagLayout 。

(2)若用户需要在紧凑的一行中以组件的自然尺寸显示较少的组件,用户可以考虑用面板容纳组件,并使用面板的默认布局管理器 FlowLayout 。

(3)若用户需要在多行或多列中显示一些同样尺寸的组件, GridLayout 最适合此情况。

(4)若界面较为复杂,可先使用面板来容纳组件,然后选用适当的布局管理器。

Page 53: 第八章   Swing 图形用户界面程序设计

53

布局管理器嵌套

实际上是容器的嵌套,被嵌套的容器可以具有不同的布局管理器

在嵌套的布局管理器中 JPanel 通常起到了 “桥”的作用

Page 54: 第八章   Swing 图形用户界面程序设计

54

例 10 :复杂GUI 的布局

Page 55: 第八章   Swing 图形用户界面程序设计

55

例 10 :实现 GUI 的步骤分析

panel1

panel2

panel3

panel5panel4

panel6

panel8panel7

Page 56: 第八章   Swing 图形用户界面程序设计

56

GUI 的设计步骤

1. 先设计一个窗口,如 JFrame

2. 确定布局管理器3. 在窗口中添加所需组件4. 增加事件处理

Page 57: 第八章   Swing 图形用户界面程序设计

57

8.5 事件处理模型

GUI 是由事件 (event) 驱动的 当用户与 GUI 交互可以产生事件 (events) 一些常见的交互方式

移动鼠标 用鼠标点击按钮 在文本框中输入数据 关闭窗口等

Page 58: 第八章   Swing 图形用户界面程序设计

58

事件处理用户交互用户交互

事 件

如:单击鼠标 如:按下 /释放鼠标按

对象状态改变对象状态改变调用事件处理

确定发生的事件的类型

确定生成的事件的组件

编写合适的代码处理事件

• 事件作用于对象。• 对象识别事件并做出响应,不同的对象能识别的事件不全相同。• 可以针对相应的事件编写相应的代码,在事件发生时,程序执行事件里的代码。

Page 59: 第八章   Swing 图形用户界面程序设计

59

事件处理模型

源对象源对象 监听器监听器事件 传播

事件的实例 事件的实例 方法 方法

传递途径

代理事件模型

Swing 中的 GUI 组件

适配器对象

Page 60: 第八章   Swing 图形用户界面程序设计

60

事件处理机制

主要涉及三种对象 事件源 (An event source) 事件对象 (An event object) 事件监听器 (event listener(s))

事件监听器 A

事件监听器 B

事件对象

事件对象

事件源( 例如 : 按钮 )

Page 61: 第八章   Swing 图形用户界面程序设计

61

事件处理机制

事件源 可供用户进行交互的 GUI 组件

事件对象 封装了包含所发生的各种事件的有效信息 信息包括 : 事件源的引用、以及事件监听器在处理

事件时所需要的其它各种信息 事件信息被包含在类 AWTEvent或其子类的实例

对象中 事件监听器

接受事件对象,并处理事件对象

Page 62: 第八章   Swing 图形用户界面程序设计

62

事件处理机制包含事件处理的程序应该包括以下四部分内容:1 、引入系统事件类包,如 import java.awt.event.* 。2 、在事件处理类的声明中指定要实现的监听器名,如: public class MyClass implements ActionListener { …}

3 、注册事件源对象的事件监听者,如 btn.addActionListener (this) 。

4 、实现监听器中的接口 如实现按钮事件监听接口 ActionListener : public void actionPerformed(ActionEvent e) {

...//响应某个动作的代码 ...

}

Page 63: 第八章   Swing 图形用户界面程序设计

63

事件分类与监听器接口1 、事件分类

java.util.EventObject

Java.awt.AWTEvent

ActionEventAdjustmentEventComponentEventItemEventTextEvent …

ContainerEventFocusEventWindowEventPaintEventInputEvent

MouseEventKeyEvent

Page 64: 第八章   Swing 图形用户界面程序设计

64

2 、监听器接口 对于每种类型的事件,都定义了相应的事件处理接口; XXXEvent 对应的事件处理接口通常为 XXXListener 。

java.util.EventListenerActionListenerItemListenerWindowListenerKeyListenerMouseListenerMouseMotionListener…

Page 65: 第八章   Swing 图形用户界面程序设计

65

事件接口及处理方法 事件描述信息 接口名称 方法(事件)

点击按钮、点击菜单项、文本框按回车等动作

ActionListener actionPerformed(ActionEvent)

选择了可选项的项目,如复选框、单选按钮、下拉选项框

ItemListener itemStateChanged(ItemEvent)

文本组件内容改变 TextListener textValueChanged(TextEvent)

移动了滚动条等组件 AdjustmentListener

adjustmentVlaueChanged(AdjustmentEvent)

鼠标移动 MouseMotionListener

mouseDragged(MouseEvent)

mouseMoved(MouseEvent)

鼠标点击等 MouseListener mousePressed(MouseEvent)

mouseReleased(MouseEvent)

mouseEntered(MouseEvent)

mouseExited(MouseEvent)

mouseClicked(MouseEvent)

Page 66: 第八章   Swing 图形用户界面程序设计

66

事件接口及处理方法(续) 描述信息 接口名称 方法(事件)

键盘输入 KeyListener keyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)

组件收到或失去焦点

FocusListener focusGained(FocusEvent)focusLost(FocusEvent)

组件移动、缩放、显示 /隐藏等

ComponentListener

componentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)

Page 67: 第八章   Swing 图形用户界面程序设计

67

例 11: 按钮事件的示例 ( 方法 1)1. import java.awt.*;

2. import java.awt.event.* ;

3. import javax.swing.*;

4. public class TestJButton implements ActionListener{

5. public TestJButton(){

6. JFrame f = new JFrame("Test Button Event!");

7. Container c=f.getContentPane();

8. JButton b = new JButton("Press Me!");

9. b.addActionListener(this);

10. c.add(b, "Center");

11. f.setSize(200,100);

12. f.setVisible(true);

13. }

14. public void actionPerformed(ActionEvent e){

15. System.out.println("Action occurred");

16. System.out.println("Button’s label is:"+

17. e.getActionCommand());

18. }

19. public static void main(String args[ ]){

20. new TestJButton();

21. }

22. }

方法 1:采用同一个类中实现事件接口的方法

Page 68: 第八章   Swing 图形用户界面程序设计

68

例 : 按钮事件的示例 ( 方法 2)1. import java.awt.*;

2. import java.awt.event.* ;

3. import javax.swing.*;

4. public class TestJButtonDemo{

5. public TestJButtonDemo(){

6. JFrame f = new JFrame("Test Button Event!");

7. Container c=f.getContentPane();

8. JButton b = new JButton("Press Me!");

9. b.addActionListener(new ButtonHandler());

10. c.add(b, "Center");

11. f.setSize(200,100);

12. f.setVisible(true);

13. }

14. public static void main(String args[ ]){

15. new TestJButtonDemo();

16. }

17. }

Page 69: 第八章   Swing 图形用户界面程序设计

69

例 11: 按钮事件的示例 ( 方法 2)

1. import java.awt.event.*;

2. public class ButtonHandler implements ActionListener{

3. public void actionPerformed(ActionEvent e){

4. System.out.println("Action occurred");

5. System.out.println("Button’s label is:"+

6. e.getActionCommand());

7. }

8. }方法 2:采用另一个类中实现事件接口的方法

Page 70: 第八章   Swing 图形用户界面程序设计

70

例 11: 按钮事件的示例 ( 方法 3)1. import java.awt.*;

2. import java.awt.event.* ;

3. import javax.swing.*;

4. public class TestInnerButtonDemo{

5. public TestInnerButtonDemo(){

6. JFrame f = new JFrame("Test Button Event!");

7. Container c=f.getContentPane();

8. JButton b = new JButton("Press Me!");

9. b.addActionListener(new ActionListener(){

10. public void actionPerformed(ActionEvent e){

11. System.out.println("Action occurred");

12. System.out.println("Button’s label is:"+ e.getActionCommand());

13. }

14. });

15. c.add(b, "Center");

16. f.setSize(200,100);

17. f.setVisible(true);

18. }

19. public static void main(String args[ ]){

20. new TestInnerButtonDemo();

21. }

22. }

方法 3:采用匿名内部类实现事件接口的方法

Page 71: 第八章   Swing 图形用户界面程序设计

71

如何监听多个组件事件? 例 12 :编写一个允许学生在文本字段中输入一个

数的程序。创建一个每当用户单击一次就将此数加一的按钮。创建另一个每当用户单击一次就将此数减一的按钮。 界面效果如下图所示。

Page 72: 第八章   Swing 图形用户界面程序设计

72

1. import java.awt.*;2. import java.awt.event.*;3. import javax.swing.*;4. class Incrementor implements ActionListener{5. JTextField numberTxf;6. JButton incrementBtn,decrementBtn;7. public void makeGUI(){8. JFrame frm = new JFrame("Incrementor");9. Container c=frm.getContentPane();10. c.setLayout(new FlowLayout());11. numberTxf = new JTextField("0",5);12. c.add(numberTxf);13. incrementBtn = new JButton("Increment");14. c.add(incrementBtn);15. incrementBtn.addActionListener(this);16. decrementBtn= new JButton("Decrement");17. c.add(decrementBtn);18. decrementBtn.addActionListener(this);19. frm.setSize(300,100);20. frm.setVisible(true);21. }

Page 73: 第八章   Swing 图形用户界面程序设计

73

㉒ public void actionPerformed(ActionEvent e) {㉓ int oldNum = Integer.parseInt(numberTxf.getText());㉔ int newNum = oldNum;㉕ if (e.getActionCommand().equals("Increment")){㉖ newNum++;㉗ }㉘ else if (e.getActionCommand().equals("Decrement")) {㉙ newNum--;㉚ }㉛ numberTxf.setText(String.valueOf(newNum));㉜ }㉝ public static void main(String args[]) {㉞ Incrementor i = new Incrementor();㉟ i.makeGUI();㊱ }㊲ }

if(e.getSource()==incrementBtn){

else if(e.getSource()==decrementBtn){

Page 74: 第八章   Swing 图形用户界面程序设计

74

选项事件 ItemEvent 的处理

可触发选项事件的组件有: JCheckBox,JRadioButton,JComboBox

注册事件的方法: public void addItemListener(ItemListener e)

处理事件的接口 ItemListener ,仅含有方法: public void itemStateChanged(ItemEvent e)

Page 75: 第八章   Swing 图形用户界面程序设计

75

例:选项事件 ItemEvent 的处理例子 用 JComboBox 和 JCheckBox 来演示可选项

目事件接口,界面如下图所示:

Page 76: 第八章   Swing 图形用户界面程序设计

76

1. import java.awt.*;2. import java.awt.event.* ;3. import javax.swing.*;4. public class ItemDemo implements ItemListener{5. JFrame f;6. JPanel p1,p2,p3;7. JLabel birthPlace,hobby;8. JComboBox place;9. JCheckBox hobby1,hobby2,hobby3;10. public ItemDemo(String title){11. f=new JFrame(title);12. p1=new JPanel();13. birthPlace=new JLabel(" 出生地 :");14. place=new JComboBox();15. place.addItemListener(this);16. place.addItem("杭州 ");17. place.addItem("宁波 ");18. place.addItem("温州 ");19. place.addItem("绍兴 ");20. p1.add(birthPlace);21. p1.add(place);22. f.add(p1,"North");

Page 77: 第八章   Swing 图形用户界面程序设计

77

23. p2=new JPanel();24. p2.setLayout(new GridLayout(3,1));25. hobby=new JLabel(" 业余爱好 :");26. hobby1=new JCheckBox("运动 ");27. hobby1.addItemListener(this);28. hobby2=new JCheckBox("旅游 ");29. hobby2.addItemListener(this);30. hobby3=new JCheckBox("上网 ");31. hobby3.addItemListener(this);32. p2.add(hobby1);33. p2.add(hobby2);34. p2.add(hobby3);35. p3=new JPanel();36. p3.add(hobby);37. p3.add(p2);38. f.add(p3,"Center");39. 40. f.pack();41. f.setVisible(true);42. }

Page 78: 第八章   Swing 图形用户界面程序设计

78

43. public void itemStateChanged(ItemEvent e){44.

if(e.getSource()==place&&e.getStateChange()==ItemEvent.SELECTED){45. System.out.println("您当前选择的是 "+place.getSelectedItem());46. }47. else if(e.getSource()==hobby1 &&hobby1.isSelected() ){48. System.out.println("您的业余爱好有: "+hobby1.getLabel());49. }50. else if(e.getSource()==hobby2 &&hobby2.isSelected()){51. System.out.println("您的业余爱好有: "+hobby2.getLabel());52. }53. else if(e.getSource()==hobby3 &&hobby3.isSelected()){54. System.out.println("您的业余爱好有: "+hobby3.getLabel());55. }56. }57. public static void main(String args[ ]){58. new ItemDemo("测试 ItemListener!");59. }60. }

Page 79: 第八章   Swing 图形用户界面程序设计

79

练习

下列说法哪个是正确的? ( ) A) 如果一个组件注册多个监听者,该组件的

事件只会被最后一个注册的监听者处理。 B) 如果一个组件注册多个监听者,该组件的

事件将被所有注册的监听者处理。 C) 一个组件注册多个监听者将导致编译出错。 D) 一个组件一旦被注册监听器,则无法将该

监听者移去。

Page 80: 第八章   Swing 图形用户界面程序设计

80

练习

下列说法哪个是正确的? ( ) JFrame , JPanel 和 JButton 等组件都属于容

器组件。 JButton 和 JTextField 都可用 ActionListener

接口实现事件处理 一个面板 (JPanel)  不能被加入到另一个面板

(JPanel) 中 在 BorderLayout 中,添加到 NORTH 区的两

个按钮将并排显示。

Page 81: 第八章   Swing 图形用户界面程序设计

81

练习

下面说法错误的是: A 、单击 JCheckBox (复选框)产生

ItemEvent 事件,并由 ItemListener 处理。 B 、处理 JButton 和 JTextField 事件监听器接

口都是 ActionListener 。 C 、处理鼠标事件的事件监听器接口只有

MouseListener 。 D 、在 JTextField 和 JPasswordField 中输入

数据后按回车 (Enter) 键会激发一个事件。

Page 82: 第八章   Swing 图形用户界面程序设计

82

练习

使用下列哪种布局管理器,使所有的控件在界面上均匀排列? (  )

A)CardLayout B)FlowLayout C)BorderLayout D)GridLayout 容器被重新设置大小后,以下哪种布局管理器

的容器中的组件大小不随容器大小的变化而改变? ( )

A)CardLayout B)FlowLayout C)BorderLayout D)GridLayout

Page 83: 第八章   Swing 图形用户界面程序设计

83

鼠标事件处理 鼠标事件的监听器有鼠标事件监听器 (MouseListener) 、

鼠标移动事件监听器 (MouseMotionListener) 和鼠标滚轮事件监听器 (MouseWheelListener)

鼠标事件对应的类是 MouseEvent ,其中定义了以下一些常量和方法:

MOUSE_PRESSED 鼠标按下 MOUSE_CLICKED 鼠标单击 MOUSE_RELEASED 鼠标松开 MOUSE_ENTERED 鼠标进入有鼠标事件监听的容器 MOUSE_EXITED 鼠标离开有鼠标事件监听的容器 getX( ) 取得鼠标的 X 坐标 getY( ) 取得鼠标的 Y 坐标 getClickCount( ) 取得鼠标连续单击的次数

Page 84: 第八章   Swing 图形用户界面程序设计

84

例 13 :显示鼠标当前的位置1. import java.awt.event.MouseEvent;2. import java.awt.event.MouseListener;3. import java.awt.event.MouseMotionListener;4. import java.awt.Graphics;5. import java.awt.BorderLayout;6. import java.awt.Container;7. import javax.swing.JPanel;8. import javax.swing.JFrame;9. class MousePanel extends JPanel{10. int x_pos,y_pos;11. MousePanel(){12. addMouseListener(new MouseListener(){13. public void mouseClicked(MouseEvent e){}14. public void mouseEntered(MouseEvent e){}15. public void mouseExited(MouseEvent e){}16. public void mousePressed(MouseEvent e){17. x_pos=e.getX();18. y_pos=e.getY();19. repaint();20. }21. public void mouseReleased(MouseEvent e){}22. });

Page 85: 第八章   Swing 图形用户界面程序设计

85

23. addMouseMotionListener(new MouseMotionListener(){24. public void mouseMoved(MouseEvent e){25. x_pos=e.getX();26. y_pos=e.getY();27. repaint();28. } 29. public void mouseDragged(MouseEvent e){}30. });31.

32. }33. protected void paintComponent(Graphics g){34. super.paintComponent(g);35. g.drawString( " 当前位置: [" + x_pos + ", " + y_pos + "]",36. x_pos, y_pos );37. }38. }39. public class MouseDemo extends JFrame{40. public MouseDemo( ){41. super( " 鼠标位置 " );42. Container c = getContentPane( );43. c.add( new MousePanel( ), BorderLayout.CENTER);44. } 45. public static void main(String args[ ]){46. MouseDemo app = new MouseDemo( );47. app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);48. app.setSize( 270, 150 );49. app.setVisible( true );50. }51. }

Page 86: 第八章   Swing 图形用户界面程序设计

86

事件适配器类

Java 中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常命名为XxxAdapter ,在该类中以空方法体实现了相应接口的所有方法;

可通过继承适配器类来编写监听者类,在类中只需给出关心的方法,从而减轻工作量。

Page 87: 第八章   Swing 图形用户界面程序设计

87

事件接口与适配器类Listener Interface Adapter Class Methods

ActionListener 无 actionPerformed

AdjustmentListener 无 adjustmentValueChanged

ComponentListener ComponentAdapter

componentHidden componentMoved componentResized componentShown

ContainerListener ContainerAdapter componentAdded componentRemoved

FocusListener FocusAdapter focusGained focusLost

ItemListener 无 itemStateChanged

Page 88: 第八章   Swing 图形用户界面程序设计

88

事件接口与方法目录Listener Interface Adapter Class Methods

KeyListener KeyAdapterkeyPressed keyReleased keyTyped

MouseListener MouseAdapter

mouseClicked mouseEntered mouseExited mousePressed mouseReleased

MouseMotionListener MouseMotionAdapter

mouseDragged mouseMoved

TextListener 无 textValueChanged

WindowListener WindowAdapter

windowActivated windowClosed windowClosing windowDeactivated windowDeiconified windowIconified windowOpened

Page 89: 第八章   Swing 图形用户界面程序设计

89

例 13代码修改1. ……2. addMouseListener(new MouseAdapter(){3. public void mousePressed(MouseEvent e){4. x_pos=e.getX();5. y_pos=e.getY();6. repaint();7. }8. public void mouseReleased(MouseEvent e){}9. });10. addMouseMotionListener(new MouseMotionAdapter(){11. public void mouseMoved(MouseEvent e){12. x_pos=e.getX();13. y_pos=e.getY();14. repaint();15. } 16. });17. ……

Page 90: 第八章   Swing 图形用户界面程序设计

90

键盘事件 键盘事件的监听者对应的接口为 KeyListener ,

适配器为 KeyAdapter 键盘事件对应的类是 KeyEvent ,其中定义了以

下一些常量和方法: KEY_PRESSED : “按下键”事件。 KEY_RELEASED :“释放键”事件。 KEY_TYPED :“键入键”事件。 VK_* :代表键盘功能键 char getKeyChar()  返回与此事件中的键相关联的字符。 int getKeyCode()  返回与此事件中的键相关联的整数 keyCode 。 Int getKeyLocation() 返回产生此按键事件的键位置 static String getKeyModifiersText(int modifiers)

          返回描述组合键的 String ,如“ Shift” 或“ Ctrl+Shift” 。 static String getKeyText(int keyCode)

          返回描述 keyCode 的 String ,如“ HOME” 、“ F1” 或“ A” 。

Page 91: 第八章   Swing 图形用户界面程序设计

91

例 14 :键盘事件的例子1. import java.awt.BorderLayout;2. import java.awt.Container;3. import java.awt.event.FocusEvent;4. import java.awt.event.FocusListener;5. import java.awt.event.KeyAdapter;6. import java.awt.event.KeyEvent;7. import javax.swing.JFrame;8. import javax.swing.JTextField;

9. public class KeyboardDemo extends JFrame{10. public KeyboardDemo( ){11. super( " 键盘事件处理例程 " );12. Container c = getContentPane( );

13. JTextField tf = new JTextField("", 15);14. tf.addFocusListener( new FocusListener( ){15. public void focusGained(FocusEvent e){16. System.out.println("获得焦点 ");17. } 18. public void focusLost(FocusEvent e){19. System.out.println("失去焦点 ");20. } 21. } 22. );

Page 92: 第八章   Swing 图形用户界面程序设计

92

23. tf.addKeyListener( new KeyAdapter( ){24. public void keyTyped(KeyEvent e){25. System.out.println(" 键盘事件 : " + e.getKeyChar( ));26. } 27. } 28. ); 29. c.add( tf, BorderLayout.CENTER );30. }

31. public static void main(String args[ ]){32. KeyboardDemo app = new KeyboardDemo( );33. app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);34. app.setSize( 350, 80 );35. app.setVisible( true );36. } 37. }

Page 93: 第八章   Swing 图形用户界面程序设计

93

8.6 高级图像用户界面

8.6.1菜单 8.6.2表格

Page 94: 第八章   Swing 图形用户界面程序设计

94

8.6.1菜单

常规菜单:菜单栏 (JMenuBar) 、下拉式菜单(JMenu) 和菜单项。

• 菜单项:命令式菜单项 (JMenuItem) 、复选菜单项 (JCheckBoxMenuItem) 和单选菜单项 (JRadioButtonMenuItem)

弹出式菜单

Page 95: 第八章   Swing 图形用户界面程序设计

95

例 15 :菜单的用法1. JMenuBar jmb=new JMenuBar(); // 定义菜单栏2. JMenu file=new JMenu("File"); // 定义菜单3. JMenuItem item1=new JMenuItem("Open"); // 定义菜单项4. JMenuItem item2=new JMenuItem("Save");5. JMenuItem item3=new JMenuItem("Close");

6. JRadioButtonMenuItem JRMenuItem1=new JRadioButtonMenuItem("one",(Icon)new ImageIcon("face5.gif"));

7. JRadioButtonMenuItem JRMenuItem2=new JRadioButtonMenuItem(“two”);// 定义互斥菜单项,其中的“ one” 带图标

8. ButtonGroup bgroup=new ButtonGroup(); // 定义选项组对象

9. JPopupMenu popup=new JPopupMenu("my popup"); // 定义弹出式菜单10. JMenuItem it1=new JMenuItem("popup one"); // 定义弹出式菜单的菜单项11. JMenuItem it2=new JMenuItem("popup two");

Page 96: 第八章   Swing 图形用户界面程序设计

96

例 15 :菜单的用法

12. setJMenuBar(jmb);13. jmb.add(file); // 将菜单 File 加入菜单栏14. file.add(item1); // 加入菜单 File 的各菜单项15. file.add(item2);16. file.add(item3);17. file.addSeparator(); //菜单 File 中加入一分割线18. bgroup.add(JRMenuItem1); // 将互斥菜单项加入选项组19. bgroup.add(JRMenuItem2);20. file.add(JRMenuItem1); // 将互斥菜单项加入菜单 File21. file.add(JRMenuItem2);

Page 97: 第八章   Swing 图形用户界面程序设计

97

8.6.2表格

表格是 Swing 新增加的组件,主要功能是把数据以二维表格的形式显示出来。

表格用 javax.swing.table.JTable 类来实现 JTable 类常用的方法有: JTable(TableModel dm) //dm 对象中包含了表格要显

示的数据 JTable(object[][]rowData,object[]columnNams); JTable(Vector[][]rowData,Vector[]columnNams); getModel() // 获得表格的数据来源对象

Page 98: 第八章   Swing 图形用户界面程序设计

98

创建并显示一张表格 Object[][] data= { {"Jenny","female","football",new Integer(20),"ENGLISH"}, {"May","female","music",new Integer(20),"ENGLISH"}, {"Lili","female","art",new Integer(20),"CHINESE"} }; Object[] columnNames={"name","sex","hobby","age",“ nationality"};

JTable jtable1=new JTable(data,columnNames); jtable1.setRowHeight(20); JScrollPane jscrp1=new JScrollPane(); jscrp1.getViewport().add(jtable1);

Page 99: 第八章   Swing 图形用户界面程序设计

99

基于 MVC思想设置表格 MVC表示“模型-视图-控制器”,即“数

据-表示逻辑-操作” M :编写一个实现 TableModel接口的类或继承

AbstractTableModel 的子类作为 TableModel 对象,重写getColumnCount , getRowCount , getColumnName , getValueAt 等方法

V : JTable 类生成的对象以该 TableModel为参数,并负责将 TableModel 对象中的数据以表格的形式显示出来。

C :用户激发事件来改变数据

Page 100: 第八章   Swing 图形用户界面程序设计

100

例 16 :设置一个 10 行 10 列的表格 TableModel dataModel = new AbstractTableModel(){

public int getColumnCount() { return 10; } public int getRowCount() { return 10;}

public Object getValueAt(int row, int col) {

return new Integer(row*col); }

};

JTable table = new JTable(dataModel);

JScrollPane scrollpane = new JScrollPane(table);

Page 101: 第八章   Swing 图形用户界面程序设计

101

例 17 :利用 MVC思想显示表格的值 TableDemo.java

Page 102: 第八章   Swing 图形用户界面程序设计

102

作业

1 、 P327 6 , 7

Page 103: 第八章   Swing 图形用户界面程序设计

103

作业2 、基于 Swing 编写一个用户登录的界面程序,用

户类型分为学生用户和教师用户,如下图所示。如果用户输入为空,则给出“用户名不可为空”的提示信息,若是教师用户,输入的用户名和密码都是teacher ,则显示“教师用户登录成功”的提示信息;若是学生用户,输入的用户名和密码都是student ,则显示“学生用户登录成功”的提示信息;否则显示“用户名不存在或者密码不正确”。

Page 104: 第八章   Swing 图形用户界面程序设计

104

作业3 、使用 Swing 编写一个支持中文文本编辑程序 TextEdit.java ,要求

如下:① 用户界面大小为 400×200 像素,如下图所示:② 程序启动后,多行文本输入框 JTextArea 中显示当前目录下

myText.txt 文件中原有的内容,如果该文件不存在,则新建该文件。③ “保存”按钮功能:将多行文本输入框 JTextArea 中的内容写入

myText.txt 文件中保存。④ “取消”按钮功能:将多行文本输入框 TextArea 中的内容清空。⑤ “退出”按钮功能:退出程序