Download - 第八章 Swing 图形用户界面程序设计
![Page 2: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/2.jpg)
2
主要内容 简介 容器组件 基本组件 布局管理器 事件处理模型 高级图像用户界面
![Page 3: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/3.jpg)
3
8.1 简介
图形用户界面 (GUI) 数据的图形显示形式 友好的交互方式 简化计算机软件的学习过程 GUI 示例
jdk1.6\demo\jfc\SwingSet2 GUI 组件 : Labels, Text fields, Buttons 等等
![Page 4: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/4.jpg)
4
1 、关于 Swing GUI 组件
Swing GUI 组件 所在的包 : javax.swing Swing 组件的平台相关性较小 (lightweight)
早期版本的 GUI 组件 所在的包 : java.awt 与平台相关性较强
![Page 5: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/5.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/6.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/7.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/8.jpg)
8
5 、 JComponent 类的功能
1) 边框设置:使用 setBorder() 方法可以设置组件外围的边框,使用一个 EmptyBorder 对象能在组件周围留出空白。
2) 双缓冲区:使用双缓冲技术能改进频繁变化的组件的显示效果。与 AWT 组件不同, JComponent 组件默认双缓冲区,不必自己重写代码。
3) 提示信息:使用 setTooltipText() 方法,为组件设置对用户有帮助的提示信息。
![Page 9: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/9.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/10.jpg)
10
8.2 容器组件
JFrame JPanel JScrollPane JSplitPane
![Page 11: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/11.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/12.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/13.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/14.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/15.jpg)
15
2 、 JPanel( 面板 )
一种中间容器,用来组成其它组件 可以添加各种组件 ( 包括面板组件 )
面板 (JPanel) 的大小由它所包含的组件决定 当组件个数增加,面板 (JPanel) 也会随之而增大
![Page 16: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/16.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/17.jpg)
17
3 、 JScrollPane( 滚动窗口面板 ) JScrollPane 是带滚动条的面板,主要是通过移动
JViewport( 视口 ) 来实现的。 JViewport 是一种特殊的对象,用于查看基层组件,滚动
条实际就是沿着组件移动视口,同时描绘出它在下面 " 看到 " 的内容。
![Page 18: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/18.jpg)
18
滚动窗口 (JScrollPane) 效果图
![Page 19: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/19.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/20.jpg)
20
分隔板( JSplitPane) 效果图
![Page 21: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/21.jpg)
21
8.3 基本组件
标签 (JLabel) 文本框 (JTextField) 按钮 (JButton) 组合框 (JComboBox) 文本 (JTextArea) 列表 JList(单选列表和多选列表 )
![Page 22: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/22.jpg)
22
1 、标签 (JLabel)
标签 为 GUI 提供文本 ( 主要 )或图像 ( 也可以 ) 信息 对应类 (JLabel) (JComponent 的子类 ) 可以显示 :
单行的只读的文本信息 图像 同时显示文本与图像信息
程序一般不修改标签的内容
![Page 23: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/23.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/24.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/25.jpg)
25
2 、文本框 (JTextField)
显示单行的文本信息 JTextField extends JTextComponent 密码输入框 JPasswordField
![Page 26: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/26.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/27.jpg)
27
3 、按钮 (JButton)
当鼠标左键单击按钮组件时,能触发特定的事件
在 Java 中 , 广义的按钮包括 : 命令式按钮 (JButton) 复选框 (JCheckBox) 单选按钮 (JRadioButton)
![Page 28: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/28.jpg)
28
按钮类的层次结构
javax.swing.JComponent
javax.swing.AbstractButton
javax.swing.JButton javax.swing. JToggleButton
javax.swing.JCheckBox javax.swing.JRadioButton
![Page 29: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/29.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/30.jpg)
30
4 、组合框 (JComboBox)
组合框 (JComboBox) 可以从下拉式的列表框中选取其中的列表项 有时也称为下拉框 (drop-down list)
类 JComboBox 中的方法 getSelectedIndex( )
返回当前被选中的项 setMaximumRowCount( n )
设置最多显示列表项的项数 滚动条 (Scrollbar) 会自动加上
![Page 31: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/31.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/32.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/33.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/34.jpg)
34
多选列表
在 JList 中选择多个选项,方法是按住 shift 键或 ctrl 键。
多选列表没有和多个选择相关的事件。通常由另一个 GUI 组件生成的事件(外部事件)来指定处理 JList 中的多个选择。
![Page 35: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/35.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/36.jpg)
36
8.4 布局管理器
用来控制组件在容器中的布局方式 应当尽量利用已有的基本布局方式 布局管理器处理组件布局的大部分细节
![Page 37: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/37.jpg)
37
布局管理器
1. 流式布局 FlowLayout
2. 边界布局 BorderLayout
3. 盒式布局管理器 BoxLayout
4. 网格布局 GridLayout
5. 卡片布局 CardLayout
6. 网格包布局 GridBagLayout
![Page 38: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/38.jpg)
38
1 、流式布局 FlowLayout
是一种最基本的布局管理器 是 java.awt.Applet 、 java.awt.Panel 和
javax.swing.JPanel 的默认布局方式 在容器中,从左到右依次放置 GUI 组件 当组件排到容器一行的末尾时,则从下一行开始接着排列组件
每行组件的对齐方式可以是 : 左对齐、中间( 默认对齐方式 ) 和右对齐
![Page 39: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/39.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/40.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/41.jpg)
41
2 、边界布局 BorderLayout
是容器 JFrame 和 JApplet 的默认布局方式 将容器分成五个区域,
NORTH ( 顶部 ) SOUTH (底部 ) WEST (左侧 ) EAST (右侧 ) CENTER ( 中间 )
每个区域最多只能 1 个组件
![Page 42: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/42.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/43.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/44.jpg)
44
3 、盒式布局管理器 BoxLayout
允许多个组件在容器中沿水平方向或竖直方向排列
容器的大小发生变化时,组件占用的空间不会发生变化
![Page 45: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/45.jpg)
45
BoxLayout 的方法
构造方法: BoxLayout(Container target, int axis)
创建一个将沿给定轴放置组件的布局管理器。 轴的方向: BoxLayout.X_AXIS: 指定组件应该从左到右放置
BoxLayout.Y_AXIS: 指定组件应该从上到下放置
![Page 46: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/46.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/47.jpg)
47
4 、网格布局 GridLayout
布局管理器 GridLayout 按行与列将容器等分成网格 每个组件占用具有相同宽度和高度的网格 添加组件占用网格的顺序 : 从上到下,从左到右 当一行满了,则继续到下一行,仍然是从左到右
![Page 48: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/48.jpg)
48
GridLayout 类的构造方法
1. GridLayout() 创建默认值的网格布局,即每个组件占据一行一列。
2. GridLayout(int rows, int cols) 创建具有指定行数和列数的网格布局
3. GridLayout(int rows, int cols, int hgap, int vgap) 创建具有指定行数和列数的网格布局。
![Page 49: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/49.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/50.jpg)
50
5 、卡片布局管理器CardLayout CardLayout 的布局方式有点象码“扑克牌” 一个组件压在另一个组件的上面,所以每次一般只能看到一个组件
![Page 51: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/51.jpg)
51
6 、网格包布局GridBagLayout
GridBagLayout 是 AWT 包中提供的最灵活、最复杂的布局管理器。
GridBagLayout将组件以多行多列放置,允许指定的组件跨多行或多列。
每个 GridBagLayout 对象保留一个动态的矩形单元网格,每个组件占用一个或多个单元,称为它的显示区域。
每个由一个网格元包布局管理的组件都与一个 GridBagConstraints 的实例相关,它指定了组件在它的显示区域是如何放置的。
![Page 52: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/52.jpg)
52
使用布局管理器的基本规则
(1)若组件尽量充满容器空间,可以考虑使用BorderLayout 和 GridBagLayout 。
(2)若用户需要在紧凑的一行中以组件的自然尺寸显示较少的组件,用户可以考虑用面板容纳组件,并使用面板的默认布局管理器 FlowLayout 。
(3)若用户需要在多行或多列中显示一些同样尺寸的组件, GridLayout 最适合此情况。
(4)若界面较为复杂,可先使用面板来容纳组件,然后选用适当的布局管理器。
![Page 53: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/53.jpg)
53
布局管理器嵌套
实际上是容器的嵌套,被嵌套的容器可以具有不同的布局管理器
在嵌套的布局管理器中 JPanel 通常起到了 “桥”的作用
![Page 54: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/54.jpg)
54
例 10 :复杂GUI 的布局
![Page 55: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/55.jpg)
55
例 10 :实现 GUI 的步骤分析
panel1
panel2
panel3
panel5panel4
panel6
panel8panel7
![Page 56: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/56.jpg)
56
GUI 的设计步骤
1. 先设计一个窗口,如 JFrame
2. 确定布局管理器3. 在窗口中添加所需组件4. 增加事件处理
![Page 57: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/57.jpg)
57
8.5 事件处理模型
GUI 是由事件 (event) 驱动的 当用户与 GUI 交互可以产生事件 (events) 一些常见的交互方式
移动鼠标 用鼠标点击按钮 在文本框中输入数据 关闭窗口等
![Page 58: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/58.jpg)
58
事件处理用户交互用户交互
事 件
如:单击鼠标 如:按下 /释放鼠标按
钮
对象状态改变对象状态改变调用事件处理
确定发生的事件的类型
确定生成的事件的组件
编写合适的代码处理事件
• 事件作用于对象。• 对象识别事件并做出响应,不同的对象能识别的事件不全相同。• 可以针对相应的事件编写相应的代码,在事件发生时,程序执行事件里的代码。
![Page 59: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/59.jpg)
59
事件处理模型
源对象源对象 监听器监听器事件 传播
事件的实例 事件的实例 方法 方法
传递途径
代理事件模型
Swing 中的 GUI 组件
适配器对象
![Page 60: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/60.jpg)
60
事件处理机制
主要涉及三种对象 事件源 (An event source) 事件对象 (An event object) 事件监听器 (event listener(s))
事件监听器 A
事件监听器 B
事件对象
事件对象
事件源( 例如 : 按钮 )
![Page 61: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/61.jpg)
61
事件处理机制
事件源 可供用户进行交互的 GUI 组件
事件对象 封装了包含所发生的各种事件的有效信息 信息包括 : 事件源的引用、以及事件监听器在处理
事件时所需要的其它各种信息 事件信息被包含在类 AWTEvent或其子类的实例
对象中 事件监听器
接受事件对象,并处理事件对象
![Page 62: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/62.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/63.jpg)
63
事件分类与监听器接口1 、事件分类
java.util.EventObject
Java.awt.AWTEvent
ActionEventAdjustmentEventComponentEventItemEventTextEvent …
ContainerEventFocusEventWindowEventPaintEventInputEvent
MouseEventKeyEvent
![Page 64: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/64.jpg)
64
2 、监听器接口 对于每种类型的事件,都定义了相应的事件处理接口; XXXEvent 对应的事件处理接口通常为 XXXListener 。
java.util.EventListenerActionListenerItemListenerWindowListenerKeyListenerMouseListenerMouseMotionListener…
![Page 65: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/65.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/66.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/67.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/68.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/69.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/70.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/71.jpg)
71
如何监听多个组件事件? 例 12 :编写一个允许学生在文本字段中输入一个
数的程序。创建一个每当用户单击一次就将此数加一的按钮。创建另一个每当用户单击一次就将此数减一的按钮。 界面效果如下图所示。
![Page 72: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/72.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/73.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/74.jpg)
74
选项事件 ItemEvent 的处理
可触发选项事件的组件有: JCheckBox,JRadioButton,JComboBox
注册事件的方法: public void addItemListener(ItemListener e)
处理事件的接口 ItemListener ,仅含有方法: public void itemStateChanged(ItemEvent e)
![Page 75: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/75.jpg)
75
例:选项事件 ItemEvent 的处理例子 用 JComboBox 和 JCheckBox 来演示可选项
目事件接口,界面如下图所示:
![Page 76: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/76.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/77.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/78.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/79.jpg)
79
练习
下列说法哪个是正确的? ( ) A) 如果一个组件注册多个监听者,该组件的
事件只会被最后一个注册的监听者处理。 B) 如果一个组件注册多个监听者,该组件的
事件将被所有注册的监听者处理。 C) 一个组件注册多个监听者将导致编译出错。 D) 一个组件一旦被注册监听器,则无法将该
监听者移去。
![Page 80: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/80.jpg)
80
练习
下列说法哪个是正确的? ( ) JFrame , JPanel 和 JButton 等组件都属于容
器组件。 JButton 和 JTextField 都可用 ActionListener
接口实现事件处理 一个面板 (JPanel) 不能被加入到另一个面板
(JPanel) 中 在 BorderLayout 中,添加到 NORTH 区的两
个按钮将并排显示。
![Page 81: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/81.jpg)
81
练习
下面说法错误的是: A 、单击 JCheckBox (复选框)产生
ItemEvent 事件,并由 ItemListener 处理。 B 、处理 JButton 和 JTextField 事件监听器接
口都是 ActionListener 。 C 、处理鼠标事件的事件监听器接口只有
MouseListener 。 D 、在 JTextField 和 JPasswordField 中输入
数据后按回车 (Enter) 键会激发一个事件。
![Page 82: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/82.jpg)
82
练习
使用下列哪种布局管理器,使所有的控件在界面上均匀排列? ( )
A)CardLayout B)FlowLayout C)BorderLayout D)GridLayout 容器被重新设置大小后,以下哪种布局管理器
的容器中的组件大小不随容器大小的变化而改变? ( )
A)CardLayout B)FlowLayout C)BorderLayout D)GridLayout
![Page 83: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/83.jpg)
83
鼠标事件处理 鼠标事件的监听器有鼠标事件监听器 (MouseListener) 、
鼠标移动事件监听器 (MouseMotionListener) 和鼠标滚轮事件监听器 (MouseWheelListener)
鼠标事件对应的类是 MouseEvent ,其中定义了以下一些常量和方法:
MOUSE_PRESSED 鼠标按下 MOUSE_CLICKED 鼠标单击 MOUSE_RELEASED 鼠标松开 MOUSE_ENTERED 鼠标进入有鼠标事件监听的容器 MOUSE_EXITED 鼠标离开有鼠标事件监听的容器 getX( ) 取得鼠标的 X 坐标 getY( ) 取得鼠标的 Y 坐标 getClickCount( ) 取得鼠标连续单击的次数
![Page 84: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/84.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/85.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/86.jpg)
86
事件适配器类
Java 中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常命名为XxxAdapter ,在该类中以空方法体实现了相应接口的所有方法;
可通过继承适配器类来编写监听者类,在类中只需给出关心的方法,从而减轻工作量。
![Page 87: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/87.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/88.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/89.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/90.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/91.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/92.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/93.jpg)
93
8.6 高级图像用户界面
8.6.1菜单 8.6.2表格
![Page 94: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/94.jpg)
94
8.6.1菜单
常规菜单:菜单栏 (JMenuBar) 、下拉式菜单(JMenu) 和菜单项。
• 菜单项:命令式菜单项 (JMenuItem) 、复选菜单项 (JCheckBoxMenuItem) 和单选菜单项 (JRadioButtonMenuItem)
弹出式菜单
![Page 95: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/95.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/96.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/97.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/98.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/99.jpg)
99
基于 MVC思想设置表格 MVC表示“模型-视图-控制器”,即“数
据-表示逻辑-操作” M :编写一个实现 TableModel接口的类或继承
AbstractTableModel 的子类作为 TableModel 对象,重写getColumnCount , getRowCount , getColumnName , getValueAt 等方法
V : JTable 类生成的对象以该 TableModel为参数,并负责将 TableModel 对象中的数据以表格的形式显示出来。
C :用户激发事件来改变数据
![Page 100: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/100.jpg)
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 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/101.jpg)
101
例 17 :利用 MVC思想显示表格的值 TableDemo.java
![Page 102: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/102.jpg)
102
作业
1 、 P327 6 , 7
![Page 103: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/103.jpg)
103
作业2 、基于 Swing 编写一个用户登录的界面程序,用
户类型分为学生用户和教师用户,如下图所示。如果用户输入为空,则给出“用户名不可为空”的提示信息,若是教师用户,输入的用户名和密码都是teacher ,则显示“教师用户登录成功”的提示信息;若是学生用户,输入的用户名和密码都是student ,则显示“学生用户登录成功”的提示信息;否则显示“用户名不存在或者密码不正确”。
![Page 104: 第八章 Swing 图形用户界面程序设计](https://reader036.vdocuments.pub/reader036/viewer/2022081416/56812a64550346895d8ddb65/html5/thumbnails/104.jpg)
104
作业3 、使用 Swing 编写一个支持中文文本编辑程序 TextEdit.java ,要求
如下:① 用户界面大小为 400×200 像素,如下图所示:② 程序启动后,多行文本输入框 JTextArea 中显示当前目录下
myText.txt 文件中原有的内容,如果该文件不存在,则新建该文件。③ “保存”按钮功能:将多行文本输入框 JTextArea 中的内容写入
myText.txt 文件中保存。④ “取消”按钮功能:将多行文本输入框 TextArea 中的内容清空。⑤ “退出”按钮功能:退出程序