390 likes | 555 Views
第十章. 图形用户界面设计. 回顾. 掌握多线程的概念 掌握如何创建线程 了解死锁的概念 了解线程同步 了解使用 wait() 和 notify() 在线程之间进行通信. 目标. GUI 相关概念 布局管理器 事件处理 常用 Swing 组件. 10.1.1 GUI 包和简单 GUI 程序2-1 . 1. java.awt 包 称为抽象窗口工具集 AWT(Abstract Window Toolkit), 是使用 Java 进行 GUI 设计的基础。 2. javax.swing 包
E N D
第十章 图形用户界面设计
回顾 • 掌握多线程的概念 • 掌握如何创建线程 • 了解死锁的概念 • 了解线程同步 • 了解使用 wait() 和 notify() 在线程之间进行通信
目标 • GUI相关概念 • 布局管理器 • 事件处理 • 常用Swing组件
10.1.1 GUI包和简单GUI程序2-1 1.java.awt包 称为抽象窗口工具集AWT(Abstract Window Toolkit),是使用Java进行GUI设计的基础。 2.javax.swing包 Swing组件存放在javax.swing包中。几乎所有AWT组件对应有新功能更强的Swing组件。另外还加入了一些全新的组件。Swing组件在名称上前面多了一个字母“J” 。
10.1.1 GUI包和简单GUI程序2-2 3.设置GUI应用程序的流程: (1)引用需要的包和类。 (2)设置一个顶层的容器。 (3)根据需要为容器设置布局管理器或使用默认布局管理器。 (4)将组件添加到容器内,位置自行设计。 (5)为响应事件的组件编写事件处理代码。
10.1.2 容器、组件、布局和观感 1.容器和组件 组件是可以用图形化的方式显示在屏幕上并能够与用户进行交互的对象。 容器是一种特殊的组件,一种能够容纳其他组件或容器的组件。 2.布局管理器 为了使图形用户界面具有良好的平台无关性,提供了专门用来管理组件在容器中的布局的工具。 3.观感 决定swing应用程序的外观。
10.2 布局管理器 • Java中的布局类型包括以下几种: • FlowLayout(流式布局) • BorderLayout (边界布局) • GridLayout(网格布局) • CardLayout (卡片布局) • GridBagLayout(网格包布局)
10.2.1 FlowLayout布局管理器 • FlowLayout的构造函数有: • FlowLayout( ):生成一个默认的流式布局 • FlowLayout(int alignment):可以设定每一行组件的对齐方式 • FlowLayout(int alignment,int horz,int vert):可以设定组件间的水平和垂直距离 Applet和面板的缺省布局 组件从左上角开始按从左到右、从上到下的方式排列 FlowLayout mylayout = new FlowLayout(); FlowLayout exLayout = new FlowLayout(FlowLayout.RIGHT); setLayout(exlayout); // 为容器设置新布局
10.2.2 BorderLayout布局管理器 • 下面是BorderLayout所定义的构造函数: • - BorderLayout( ):生成默认的边界布局 • - BorderLayout(int horz,int vert): 可以设定组件间的水平和垂直距离 窗口、框架和对话框等的缺省布局 组件被置于容器的北、南、东、西或中间位置 . . . setLayout(new BorderLayout()); Button btnEast=new Button("东"); Button btnWest=new Button("西"); Button btnNorth=new Button("北"); Button btnSouth=new Button("南"); Button btnCenter=new Button("中"); add(btnEast,BorderLayout.EAST); add(btnWest,BorderLayout.WEST); add(btnNorth,BorderLayout.NORTH); add(btnSouth,BorderLayout.SOUTH); add(btnCenter,BorderLayout.CENTER);
10.2.3 GridLayout布局管理器 • GridLayout的构造函数如下所示: - GridLayout():生成一个单列的网格布局 - GridLayout(int row,int col):生成一个设定行数和列数的网格布局 - GridLayout(int row,int col,int horz,int vert):可以设置组件之间的水平和垂直间隔 用于将容器区域划分为一个矩形网格 组件按行和列排列 . . . Button btn[]; // 声明按钮数组 String str[]={"1","2","3","4","5","6","7","8","9"}; setLayout(new GridLayout(3,3)); btn=new Button[str.length]; // 创建按钮数组 for(int i=0;i<str.length;i++){ btn[i]=new Button(str[i]); add(btn[i]); }
10.2.4 CardLayout布局管理器 • 可存储几个不同的布局。 • 每个布局就像是一个卡片组中的一张卡片。 • 在一个给定的时间总会有一张卡片在顶层。 • 卡片通常为一个 Panel 对象。 • 每当需要许多面板切换,而每个面板需要显示为不同布局时,可以使用卡片布局。
10.2.5 GridBagLayout布局管理器 • 通过使用以下语法容器可获得 GridBagLayout: GridBagLayout gb=new GridBagLayout(); ContainerName.setLayout(gb); • 要使用此布局,必须提供各组件的大小和布局等信息。 • GridBagConstraints 类中包含 GridBagLayout 类用来定位及调整组件大小所需的全部信息。 组件大小不必相同 组件按行和列排列 放置顺序不一定为从左至右和由上至下
GridBagConstraints 类 2-1 • 成员变量列表: • gridx, gridy : 指定组件放置于哪个单元中 • gridwidth, gridheight : 指定组件将占用多少行和多少列 • weightx, weighty : 指定在一个 GridBagLayout 中应如何分配空间,这些变量的缺省值为 0 • ipadx, ipady : 指定组件的最小高度和宽度
GridBagConstraints 类2-2 • 成员变量列表: • fill : 指定在单元大于组件的情况下,组件如何填充此单元,共有4可选值。缺省值为:GridBagConstraints.NONE • anchor : 指定将组件放置在单元中的位置,共有9个可选值。缺省值为:GridBagConstraints.CENTER
10.2.6 swing布局管理器 1. BoxLayout布局管理器 按照从上到下(即Y轴)或者从左到右(即X轴)的顺序来依次排列组件。 2.ScrollPaneLayout布局管理器 是JScrollPane中的内置布局管理器,所以不需要单独创建,会自动设置。
10.2.7 Null布局管理器 在某些情况下,用户不想使用布局管理器,需要自己设置组件的位置和大小,这时应取消容器的布局管理器,然后再进行设置,否则用户自定义设置将会被布局管理器覆盖。取消布局管理器的方法是: setLayout(null); 用户使用setLocation()、setSize()、setBounds()等方法为组件设置位置和大小。需要注意的是,这种方法会导致程序与系统相关,如不同的分辨率会产生不同的效果。
10.3.1 事件处理模型 • Java 最新的事件处理方法是基于授权事件模型 • 当事件来源对象因用户的操作(鼠标或键盘),系统会自动触发此事件类对象E,并通知所授权的事件监听者A(若来源对象已向A注册),事件监听者A中有处理各种事件的方法(事件处理者1~n)便会处理此事件E的各种状况 。
10.3.3 事件处理方法 • 实现事件监听器接口法: • 首先给组件注册监听器,使用下列方法: addxxxListener(事件监听器对象); • 确定了事件监听器的类型后,必须在程序中定义类来实现这些接口,重写接口中的所有方法。 addKeyListener(new CharType()); public class CharType implements KeyListener{ public void keyPressed(KeyEvent e){……} //大括号中为处理事件的代码 public void keyReleased(KeyEvent e){} //未用到此方法,所以方法体为空 public void keyTyped(KeyEvent e){} }
10.3.4 事件适配器 • 使用实现事件监听器接口的方法处理事件时,必须重写监听器接口中的所有方法,尽管有些方法不会用到。 • 继承事件适配器类,只需要重写所需要的方法即可。 addKeyListener(new CharType()); 为事件源注册事件监听器的方法同上。 public class CharType extends KeyAdapter{ public void keyPressed(KeyEvent e){……}//大括号中为处理事件的代码 } }
10.4.1 常用容器组件3-1 • 是放置其他Swing 组件的顶级容器 • JFrame 组件用于在 Swing 程序中创建窗体 • 它的构造函数: • JFrame() • JFrame(String Title) • 组件必须添加至内容窗格,而不是直接添加至 JFrame 对象,示例: frame.getContentPane().add(b);
10.4.1 常用容器组件3-2 • JPanel 组件是一个中间容器 • 用于将小型的轻量级组件组合在一起 • JPanel 的缺省布局为 FlowLayout • JPanel 具有下列构造函数: • JPanel() • JPanel(LayoutManager lm)
10.4.1 常用容器组件3-3 • JApplet也是一种窗口容器,继承自Applet类,Applet小程序是另一种Java程序,与Applet不同的是,它默认的布局管理器是JAppletBorderLayout,而Applet默认的布局管理器是FlowLayout。 • 可直接向Applet窗口中添加组件,但JApplet不行,添加组件时必须添加到其内容窗格中。得到内容窗格使用方法: getContentPane();
10.4.2 标签(JLabel) • 它既可以显示文本也可以显示图像 • 构造函数如下: • JLabel(Icon icon):icon表示使用的图标 • JLabel(String text,Icon icon,int align):text表示使用的字符串; icon表示使用的图标;align表示水平对齐方式,其值可以为:LEFT、RIGHT、CENTER。 • 其它常用方法 getText() setText(String text)
10.4.3 按钮(JButton) • 可以使用以下任一构造函数来创建按钮: • JButton() : 新建一个空的按钮 • JButton(Icon icon) • JButton(String text) • JButton(String text, Icon icon) JButton btnOk=new JButton("确定!"); JButton btnCancel=new JButton("取消!"); getContentPane.add(btnOk); getContentPane.add(btnCancel);
10.4.4 文本框--JTextField • JTextField 组件允许输入或编辑单行文本 • 此类的构造函数包括: • JTextField() • JTextField(Document doc, String text, int columns) • JTextField(int columns) • JTextField(String text) • JTextField(String text, int columns) … Container con = getContentPane(); con.setLayout(new FlowLayout()); JLabel jl = new JLabel(“文本域”); con.add(jl); JTextField tf = new JTextField(20); con.add(tf); …
10.4.4 文本框--JPasswordField • JPasswordField 组件允许输入或编辑单行文本,并且文本被其他字符代替。 • 此类的构造函数与单行文本框类似。 • 其它方法: • char[] getPassword() • char getEchoChar() • void setEchoChar(char c)
10.4.4 文本框--JTextArea • JTextArea 组件用于接受来自用户的多行文本 • 它可实现可滚动界面 • JTextArea 组件可使用下列构造函数创建: • JTextArea() • JTextArea(int rows, int cols) • JTextArea(String text) • JTextArea(String text, int rows, int cols) • JTextArea(Document doc) • JTextArea(Document doc, String text, int rows, int cols) … JLabel jl = new JLabel(“文本区”); con.add(jl); JTextArea ta = new JTextArea(5,10); con.add(ta); …
10.4.5 复选框-JCheckBox • 复选框用于为用户提供一组选项 • JCheckBox 类具有下列构造函数: • JCheckBox() • JCheckBox(Icon icon) • JCheckBox(Icon icon, boolean selected) • JCheckBox(String text) • JCheckBox(String text, boolean selected) • JCheckBox(String text, Icon icon) • JCheckBox(String text, Icon icon, boolean selected)
10.4.6 单选按钮-JRadioButton • 单选按钮允许用户从多个选项中选择其中一个 • ButtonGroup 用于在 Swing 中创建组 • JRadioButton 对象可使用下列构造函数创建: • JRadioButton() • JRadioButton(Icon icon) • JRadioButton(Icon, boolean selected) • JRadioButton(String text) • JRadioButton(String text, boolean selected) • JRadioButton(String text, Icon icon) • JRadioButton(String text, Icon icon, boolean selected)
10.4.7 列表框-JList • public JList() : 使用空模型构造 JList • public JList(ListModel dataModel):构造一个列表,用它显示指定模型中的元素。 • public JList (Object [] listData):构造一个列表以显示指定数组listData的元素。 • JList 不支持滚动。要启用滚动,可使用下列代码: JScrollPane myScrollPane=new JScrollPane(); myScrollPane.getViewport().setView(dataList); … String stars[] = {"安东尼奥.班德拉斯","来昂纳多.迪卡普尼奥", "桑德拉.布洛克","休.格兰特","朱莉亚.罗伯茨"}; JList moviestars = new JList(stars); …
10.4.8 组合框-JComboBox • 文本域和下拉列表的组合 • 在 Swing 中,组合框由 JComboBox 表示 • 构造函数如下: • public JComboBox() : 此构造函数使用缺省数据模型创建 JComboBox • public JComboBox(ComboBoxModel asModel) : 使用现有 ComboBoxModel 中的项目的组合框 • public JComboBox(Object [] items) : 包含指定数组元素的组合框 … String names[] = {"弗雷德里克.福西斯", "约翰.克里沙姆", "玛丽.希金斯.克拉克","帕特丽夏.康威尔"}; JComboBox authors = new JComboBox(names); …
10.4.9 滑块-JSlider • JSlider():创建滑块默认范围为0至100水平方向 • JSlider(int orientation):创建范围为0至100,初值为50,水平或垂直滑块。 方向取值为JSlider.HORIZONTAL(水平方向)或JSlider.VERTICAL(垂直方向)。 • JSlider(int min,int max):创建范围从min至max,初值min和max的平均值的水平滑块。 • JSlider(int min,int max,int value):创建范围从min至max,初值为value的水平滑块。 • JSlider(int orientation,int min,int max,int value):创建范围从min至max初值为value的水平或垂直滑块。
10.4.10 菜单3-1 • 菜单显示项目列表,指明各种任务。 • 选择或单击某个选项时会打开另一个列表或子菜单。 • Swing 菜单由菜单栏、菜单和菜单项构成。 • 菜单栏是所有菜单和菜单项的根
10.4.10 菜单3-2 • JMenuBar 是可通过 JFrame、JWindow 的根窗格添加至容器的组件。 • 由多个 JMenu 组成,每个 JMenu 在 JMenubar 中都表示为字符串。 • JMenu 在 JMenuBar 下以文本字符串形式显示,而在用户单击它时,则以弹出式菜单显示。 • JMenuItem为JMenu 中的一个组件,以文本字符串形式显示,可以具有图标,外观可以修改,如字体、颜色、背景、边框等。
10.4.10 菜单3-3 弹出式菜单JPopupMenu的定义和使用:
10.4.11 对话框 1.JOptionPane对话框 是模式对话框,它提供了很多现成的对话框样式,可以供用户直接使用。 2.JFileChooser对话框 提供了标准的文件的打开、保存对话框。
总结 1、掌握GUI常用的容器。 2、掌握GUI常用的布局管理器。 3、掌握GUI常用的组件。 4、掌握GUI的事件处理机制。