资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,在线教务辅导网:,更多课程配套课件资源请访问在线教务辅导网,1,第8章 GUI编程初步,学习导言,开发具有良好的GUI(Graphics User Interface:图形用户界面)的软件无疑是程序员的追求目标。在Java语言中提供了大量的类来实现界面设计。可以实现图形界面主要有AWT工具集和Swing工具集。,本章将详细介绍Swing工具集常用的GUI组件、设置观感效果、以及AWT的布局管理等内容。,3,课程结构,8.1 GUI编程概述,8.2 Swing的常用组件,8.3 布局管理器,8.4 观感效果,4,8.1 GUI编程概述,1. Java的基础类,Java基础类(Java Foundation Classes)是构建图形用户界面的图形框架。,Java基础类是由如下的类库构成:,(1)抽象窗口工具集:AWT;,(2)Swing组件;,(3)支持剪贴板的数据传送;,(4)Java2D,高级图形图象处理;,(5)服务残疾人的辅助应用接口。,5,8.1 GUI编程概述,2.,AWT 概述,AWT是Abstract Window Toolkit的缩写,称为抽象窗口工具集,是Java基础类中一份子。AWT提供了构建用户界面组件,例如菜单、按钮、文本框、对话框、复选框等,可以根据图形界面组件的输入实现事件处理。,AWT允许绘制图形、处理图像、控制用户界面的布局、字体显示以及提供利用本地剪贴板实现数据传送类等辅助性质的类。,6,8.1 GUI编程概述,3. Swing 概述,Swing是Java基础类中的一部分,定义了具有可插入观感(Look-and-Feel)的组件。Swing是纯Java语言实现的,基于JDK1.1“轻重量”用户界面框架,并不依赖本地的工作平台。,Swing具有和AWT同性质的组件,如按钮等。从命名的角度看,Swing组件都第一个字母标有一个”J”,比如AWT按钮组件命名为Button,而Swing的按钮组件命名为JButton. Swing还定义了其他具体应用的组件,如树组件、表组件、拾取列表组件等,.,7,8.1 GUI编程概述,Swing组件采用了一种MVC的设计范式,即“模型-视图-控制”(Model-View-Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。,8,8.1 GUI编程概述,4.Swing组件和AWT组件的比较,与AWT组件比较,最大区别在于Swing组件是由纯Java代码构成,没有任何本地代码。由于这一特性,使得Swing组件具有比AWT更多的优势,具体体现在以下几个方面:,Swing的标签和按钮组件可以显示文本和图片,而不是象AWT的同性质组件一样只可以显示文本;,Swing可以实现用户定义组件的外观,而AWT组件的外观取决于本地的操作系统;,Swing具有良好的扩展性,用户可以扩展已有组件,定义新组件,AWT的扩展性差。,9,8.1 GUI编程概述,1. JFrame组件,JFrame组件定义的是框架窗口。框架窗口是一种顶层窗口,不能包含在其他窗口的窗口。这种窗口与用JWindow组件定义的窗口有明显不同,框架窗口是指具有标题栏、边界的窗口,而用JWindow组件创建的窗口是无标题和边界的窗口。在JFrame组件的窗口的标题栏上,具有可以控制标题窗口大小的图标。通常用JFrame创建的框架窗口容纳其他组件,如按钮、标签、文本框等。,10,8.2 Swing的常用组件,(1)JFrame的创建,JFrame():创建一个空的框架窗口。,JFrame(String title):创建一个标题为title的窗口。,(2)JFrame的常用方法,JFrame的常用方法见表8-2。,例8.1 JFrame的示例。程序清单见,JFrameExample .java,,运行结果见图8-2,图8-2,11,8.2 Swing的常用组件,2.标签(JLabel),标签组件是用于显示文本信息、或图标、或二者兼而有之。JLabel组件不会对用户的输入发生反应,即,对JLabel组件不能编辑。标签组件可以将显示内容垂直或水平显示,通常默认文本信息的显示状态为水平。而图标的显示状态为垂直。标签组件一般起到提示作用。,12,8.2 Swing的常用组件,(1)JLabel组件的创建,JLabel():创建空标签,无文本无图标。,JLabel(Icon image):创建一个具有图标image的标签实例。,JLabel(String text):创建一个具有文本信息text的标签实例。,JLabel(String text,int horizontalAlignment):创建一个具有特定字符信息text和对齐方式horizontalAlignment的标签实例。其中,对齐方式是在SwingContants.LEFT(左对齐)、SwingContants.CENTER(居中对齐)、SwingContants.RIGHT(右对齐)、SwingConstants.LEADING(向上对齐)和SwingConstants.TRAILING(向下对齐)。,JLabel(String text,Icon image,int horizontalAlignment ):创建具有文本text和图标image信息的标签实例,并且具有特定的对齐方式horizontalAlignment。,13,8.2 Swing的常用组件,(2)JLabel的常用方法,JLabel的常用方法见表8-3。,表8-3 JLabel的主要方法,方 法,功 能,void setText(String),设置显示内容,String getText(),获取显示内容,void setIcon(Icon icon),设置显示的图标,Icon getIcon(),获取显示的图标,void set,HorizontalAlignment,(int),设置沿x轴方向的对齐方式,int get,HorizontalAlignment,(),获取沿x轴方向的对齐方式,14,8.2 Swing的常用组件,例8.2 JLabel创建的示例。程序清单见程序,JLabelExample .java,,运行结果见图8-3,图8-3,15,8.2 Swing的常用组件,3.文本框(JTextField和JPasswordField),JTextField组件用于创建文本框。文本框是用来接受用的单行文本信息输入的区域。通常文本框用于接受用户信息或其他文本信息的输入。当用户输入文本信息后,如果为JTextField对象添加事件处理,按回车键会激发一定的动作。,(1)JTextField的创建,JTextField的构造方法常见有如下几种:,JTextField():创建一个空文本框。,JTextField(String text):创建一个具有初始文本信息text的文本框。,JTextField(String text,int columns):创建一个具有初始文本信息text以及指定列数的文本框。,(2)JTextField的常用方法,JTextField的常用方法见表8-4。,16,8.2 Swing的常用组件,表8-4 JTextField的主要方法,方 法,功 能,void setText(String),设置显示内容,String getText(),获取显示内容,void setFont(Font),设置显示文本的字体,void set,HorizontalAlignment,(int),设置沿x轴方向的对齐方式,int get,HorizontalAlignment,(),获取沿x轴方向的对齐方式,void setColumns(int),设置列数,int getColumns(),获取列数,Dimension getPreferredSize(),获取此文本框所需的首选大小尺寸,17,8.2 Swing的常用组件,JPasswordField是JTextField的子类,是一种特殊的文本框,也是用来接受单行文本信息的输入的区域,但会用回显字符串代替输入的文本信息。因此,JPasswordField组件也称为密码文本框。JPasswordField的默认的回显字符是“*”,用户可以自行设置回显字符。,(3)JPasswordField的创建,JPasswordField的构造方法有如下几种:,JPasswordField():创建一个空的密码文本框。,JPasswordField(String text):创建一个指定初始文本信息的密码文本框。,JPasswordField(String text,int columns):创建一个指定文本和列数的密码文本框。,JPasswordField(int columns):创建一个指定列数的密码文本框。,18,8.2 Swing的常用组件,(4)JPasswordField的常用方法,JPasswordField是JTextField的子类,所以JPasswordField也具有和JTextField类似名称和功能的方法,因此,该组件也具有表8-4的方法。此外,它还具有自己的独特方法,具体见表8-5。,表8-5 JPasswordField的主要方法,方 法,功 能,boolean echoCharIsSet(),获取设置回显字符的状态,void setEchoChar(char),设置回显字符,char getEchoChar(),获取回显字符,char getPassword(),获取组件的文本,例8.3 JTextField和JPasswordField的示例。程序清单见程序,JTextFieldExample,.,java,,运行结果见图8-4,图8-4,19,8.2 Swing的常用组件,20,8.2 Swing的常用组件,5.,文本区(JTextArea),JTextArea组件是文本区组件。它与JTextField一样能接受文本信息的输入和显示。但是与JTextField组件不同的是,JTextArea对象可以多行输入与显示,突破了JTextField的单行的限制。但是,如果文本信息的行数超过文本区限定的行数,超出的文本信息不能显示。为了解决这个问题,可以借助JScrollPane滚动窗格组件。将文本区放置到滚动窗格中,就可以实现超出文本信息的滚动输出。,21,8.2 Swing的常用组件,(1)JTextArea的创建,JTextArea的构造方法有如下几种:,JTextArea():创建一个空文本区。,JTextArea(int rows,int columns):创建一个指定行数和列数的文本区。,JTextArea(String text):创建一个具有初始显示内容的文本区。,JTextArea(String text,int rows,int columns):创建一个指定行数和列数具有初始文本信息的文本区。,(2)JTextArea的常用方法,JTextArea的常用方法见表8-6。,22,8.2 Swing的常用组件,表8-6 JTextArea的主要方法,方 法,功 能,void setColumns(int),设置列数,int getColumns(),获取列数,void setRows(int),设置行数,int getRows(),获取行数,void setFont(Font),设置字体,void insert(String,int),将指定文本插入到指定位置,void append(String),尾部添加文本信息,int getLineCount(),获取文本区包含的行数,void setEditable(boolean),设置可写状态,boolean isEditable(),获取可写状态,23,8.2 Swing的常用组件,例8.4 JTextArea的示例。程序清单见程序,JTextAreaExample,.java,运行结果见图8-5.,图8-5,24,8.2 Swing的常用组件,6.按钮(JButton),JButton是用来创建命令按钮。JButton对象具有这样的功能:当用户按下命令按钮,会激发一定的动作。JButton创建的按钮可以具有图标和文本信息的内容,通过它们可以有效地提示及帮助用户操作。,(1),JButton的创建,JButton常用的构造方法有如下几种:,JButton():创建一个空按钮。,JButton(String text):创建一个具有文本提示的按钮。,JButton(Icon icon):创建一个具有图标提示的按钮。,JButton(String text,Icon icon):创建一个具有文本和图标的按钮。,(2) JButton的常用方法,JButton的常用方法见表8-7。,25,8.2 Swing的常用组件,例8.5 JButton的示例。程序清单见程序,JButtonExample .java,,运行结果见图8-6,8-7,8-8.,图8-6,图8-7,图8-8,表8-7 JButton的主要方法,方 法,功 能,void setText(String),设置文本,String getText(),获取文本,void setPressedIcon(Icon),设置按下的图标,Icon getPressedIcon(),获取按下的图标,void setRolloverIcon(Icon),设置翻滚图标,Icon getRolloverIcon(),获取翻滚图标,void setMnemonic(int),设置快捷键,int getMnemonic(),获取快捷键,void set,HorizontalAlignment,(int),设置沿x轴方向的对齐方式,int get,HorizontalAlignment,(),获取沿x轴方向的对齐方式,26,8.2 Swing的常用组件,7.,复选框和单选框(JCheckBox和JRadioButton),JCheckBox组件可以用来创建具有文本和图标的复选框。这种复选框具有来“选中”或“取消选中”状态,可以通过用户的选择来实现。通常,用多个复选框作为一组来表示多种组合条件,用户可以同时选择多个复选框。,JRadioButton组件可以用来创建具有文本和图标的单选按钮,和JCheckBox组件一样,可以表示“选中”或“取消选中”状态。可以定义一个或多个单选按钮添加到一个ButtonGroup按钮组作为整体处理,只不过在任何情况下,只有一个单选按钮能处于“选中”状态,其他单选按钮处于“非选中”状态中。一般,定义多个单选按钮来表示多个条件选择一种的情况。,27,8.2 Swing的常用组件,(1)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):创建一个指定文本图标以及指定状态的复选框。,28,8.2 Swing的常用组件,(2)JCheckBox的常用方法,JCheckBox的常用方法见表8-8。,表8-8 JCheckBox的主要方法,方 法,功 能,void setText(String),设置文本,String getText(),获取文本,void setIcon(Icon),设置图标,Icon getIcon(),获取图标,void setSelected(boolean),设置选择状态,boolean getSelected(),获取选择状态,void setSelectedIcon(Icon),设置选中的图标,Icon getSelectedIcon(),获取选中的图标,29,8.2 Swing的常用组件,(3) JRadioButton的创建,JRadioButton的构造方法有如下几种:,JRadioButton():创建一个初始未选择无文本无图标的单选按钮。,JRadioButton(Icon icon):创建一个指定图标的单选按钮。,JRadioButton(Icon icon, boolean selected):创建一个指定图标指定选择状态的单选按钮。,JRadioButton(String text):创建一个指定文本未选的单选按钮。,JRadioButton(String text,boolean selected):创建一个指定文本指定选择状态的单选按钮。,JRadioButton(String text,Icon icon):创建一个指定文本指定图标的单选按钮。,JRadioButton(String text,Icon icon,boolean selected):创建一个指定文本指定图标和选择状态的单选按钮,30,8.2 Swing的常用组件,(4) JRadioButton的常用方法,JRadioButton的常用方法见表8-9。,表8-9 JRadioButton的主要方法,方 法,功 能,void setText(String),设置文本,String getText(),获取文本,void setIcon(Icon),设置图标,Icon getIcon(),获取图标,void setSelected(boolean),设置选择状态,boolean getSelected(),获取选择状态,void setSelectedIcon(Icon),设置选中的图标,Icon getSelectedIcon(),获取选中的图标,31,8.2 Swing的常用组件,例8.6 JCheckBox和JRadioButton的示例。,程序清单见程序,JCheckBoxJRadioButtonExample .java,,运行结果见图8-9.,图8-9,32,8.2 Swing的常用组件,8.组合框(JComboBox),JComboBox组件用来创建组合框对象。一般,根据组合框是否可编辑的状态,可以将组合框分成两种常见的外观。可编辑状态外观是视为文本框和下拉列表的组合,不可编辑状态的外观可视为按钮和下拉列表的组合。在按钮或文本框的右边有一个带有三角符号的下拉按钮。用户可以点击该下拉按钮,可以出现一个内容列表。这也是组合框的得名。组合框通常用于从列表的“多个项目中选择一个”的操作。,33,8.2 Swing的常用组件,(1) JComboBox的创建,JComboBox的构造方法有如下几种:,JComboBox():创建一个默认模型的组合框。,JComboBox(ComboBoxModel aModel):创建一个指定模型的组合框。,JComboBox(Object items):创建一个具有数组定义列表内容的组合框。,(2)JComboBox的常用方法,JComboBox的常用方法见表8-10。,34,8.2 Swing的常用组件,表8-10 JComboBox的主要方法,方 法,功 能,void addItemt(Object),添加项目,void removeItem(Object),移除项目,Object getItemAt(int),获取指定索引的项目,void setMaximumRowCount(),设置最大的显示行数,int getMaximumRowCount(),获取最大的显示行数,void setSelectedItem(Object),设置选中的项目,void setSelectedIndex(int),设置选中索引号的项目,boolean isEditable(),获取编辑状态,void setEditable(boolean),设置编辑状态,void showPopup(),显示弹出的窗口,35,8.2 Swing的常用组件,例8.7 JComboBox的示例。,程序清单见程序,JComboBoxExample,.java,,运行结果见图8-10.,图8-10,36,8.2 Swing的常用组件,8.列表(JList),JList组件用于定义列表,允许用户选择一个或多个项目。与JTextArea类似,JList本身不支持滚动功能,如果要显示超出显示范围的项目,可以将JList对象放置到滚动窗格JScrollPane 对象中,便可以为列表对象实现滚动操作。,37,8.2 Swing的常用组件,(1)JList的创建,JList的构造方法如下:,JList():创建一个空模型的列表,JList(ListModel dataModel):创建一个指定模型的列表。,JList(Object listdatas):创建一个具有数组指定项目内容的列表。,(2)JList的常用方法,JList的常用方法见表8-11。,38,8.2 Swing的常用组件,表8-11 JList的主要方法,方 法,功 能,int getFirstVisibleIndex(),获取第一个可见单元的索引,void setFirstVisibleIndex(int),设置第一个可见单元的索引,int getLastVisibleIndex(),获取最后一个可见单元的索引,void setLastVisibleIndex(int),设置最后一个可见单元的索引,int getSelectedIndex(),获取第一个已选的索引,void setSelectedIndex(int),设置第一个已选的索引,Object getSelectedValue(),获取第一个已选的对象,void setSelectedValue(Object),设置第一个已选的对象,Object getSelectedValues(),获取已选的所有对象,Color getSelectionBackground(),获取选中项目的背景色,void setSelectionBackground(),设置选中项目的背景色,Color getSelectionForeground(),获取选中项目的前景色,void setSelectionForeground(),设置选中项目的前景色,int getVisibleRowCount(),获取首选可见行数,void setVisibleRowCount(),设置首选可见行数,void setListData(Object),设置列表项目,void setListData(Vector),设置列表项目,39,8.2 Swing的常用组件,例8.8 JList的示例。,程序清单见程序,JListExample,.java,,运行结果见图8-11.,图8-11,40,8.2 Swing的常用组件,9.面板(JPanel),JPanel组件定义的面板实际上是一种容器组件,用来容纳各种其他轻量级的组件。此外,用户还可以用这种面板容器绘制图形。,(1)JPanel的构造方法如下所示:,JPanel():创建具有双缓冲和流布局(FlowLayout)的面板。,JPanel(LayoutManager layout):创建具有指定布局管理器的面板。,41,8.2 Swing的常用组件,(2),JPanel的常用方法,JPanel的常用方法见表8-12。,表8-12 JPanel的主要方法,方 法,功 能,void add(Component),添加组件,void add(Component,int),添加组件至索引指定位置,void add(Component,Object),按照指定布局限制添加组件,void add(Component,Object,int),按照指定布局管理限制添加组件至指定位置,void remove(Component),移除组件,void remove(int),移除指定位置的组件,void removeAll(),移除所有组件,void paintComponent(Graphics),绘制组件,void repaint(),重新绘制,void setPreferredSize(Dimension),设置最佳尺寸,Dimension getPreferredSize(),获取最佳尺寸,42,8.2 Swing的常用组件,例8.9 JPanel的示例。,程序清单见程序,JPanelExample,.java,,运行结果见图8-12.,图8-12,43,8.2 Swing的常用组件,10.菜单制作,许多软件都提供菜单方便用户操作。Java语言也提供了对菜单的支持。在Java语言中,菜单组件是特殊的组件群,菜单并不依托其他容器组件存在,菜单依赖于菜单条而存在。但是,菜单条必须放置到容器组件中才能显示。通常容器组件具有方法setJMenuBar()来实现这一功能。菜单条(JMenuBar)中包含若干菜单、而菜单(JMenu)中又容纳了各种菜单项。其中,菜单项包括三种形式:普通菜单项(JMenuItem)、复选框菜单项(JCheckBoxMenuItem)和单选按钮菜单项(JRadioButtonMenuItem)。对于类JCheckBoxMenuItem和类JRadioButtonMenuItem是JMenuItem的子类,表示了特殊形式的菜单项。,44,8.2 Swing的常用组件,此外,还有一种特殊形式的菜单,就是弹出菜单(JPopupMenu),也称为快捷菜单。在使用某些软件时,往往单击鼠标右键,会出现一个弹出菜单,弹出菜单中包含各种菜单项。不过,弹出菜单并不依托菜单条,它依赖于其他容器组件而存在。,45,8.2 Swing的常用组件,(1)JMenuBar,JMenuBar用来实现菜单条,它的构造方法如下:,JMenuBar():创建空的菜单条。,JMenuBar的常用方法见表8-13。,表8-13 JMenuBar的主要方法,方 法,功 能,JMenu add(JMenu),添加菜单至菜单条,JMenu getMenu(int),获取指定位置的菜单,int getMenuCount(),获取菜单的个数,46,8.2 Swing的常用组件,(2)JMenu和JPopupMenu,JMenu是用来创建菜单对象,它的构造方法有:,JMenu():创建空的菜单。,JMenu(String string):创建指定文本的菜单。,JMenu(String s, boolean b):创建指定文本的菜单,并指定菜单的显示方式是否是分离式的。,JMenu的常用方法见表8-14。,47,8.2 Swing的常用组件,表8-14 JMenu的主要方法,方 法,功 能,JMenuItem add(Action),添加带有特定动作的菜单项,Component add(Component),添加组件至菜单,Component add(Component,int),在指定位置添加组件,JMenuItem add(JMenuItem),添加菜单项,JMenuItem add(String),添加带有文本信息的菜单项,void addSeparator(),添加分离线,JPopupMenu getPopupMenu(),获取与菜单相关联的弹出菜单,JMenuItem insert(JMenuItem,int),将菜单项插入到指定位置,boolean isPopupMenuVisible(),获取与菜单相关联的弹出菜单可见,boolean isSelected(),获取菜单选择状态,void removeAll(),移除所有的菜单项,void addAccelerator(KeyStroke),增加快捷键,void setDelay(int),设置弹出菜单出现的延迟时间,48,8.2 Swing的常用组件,JPopupMenu,JPopupMenu的构造方法如下所示:,JPopupMenu():创建无激发的弹出菜单。,JPopupMenu(String):创建具有特定标题的弹出菜单。,JPopupMenu的常用方法见表8-15。,表8-15 JPopupMenu的主要方法,方 法,功 能,JMenuItem add(Action),添加带有特定动作的菜单项,JMenuItem add(JMenuItem),添加菜单项,JMenuItem add(String),添加带有文本信息的菜单项,void addSeparator(),添加分离线,void show(Component,int,int),在指定组件中的指定位置显示弹出菜单,boolean isVisible(),获取弹出菜单可见性,void pack(),按显示所有组件的最小尺寸排列,void remove (int),移除指定位置的菜单项,49,8.2 Swing的常用组件,(3) JMenuItem、JCheckBoxMenuItem和JRadioButtonMenuItem,JMenuItem,JMenuItem的构造方法有如下几种:,JMenuItem():创建一个空菜单项。,JMenuItem(String text):创建一个具有特定文本信息的菜单项。,JMenuItem(Icon icon):创建一个具有特定图标的菜单项。,JMenuItem(String text,Icon icon):创建一个具有指定文本和特定图标的菜单项。,JMenuItem(String text,int mnemonic):创建一个具有特定文本和键盘助忆符的菜单项。,JMenuItem的常用方法见表8-16。,50,8.2 Swing的常用组件,表8-16 JMenuItem的主要方法,方 法,功 能,KeyStroke getAccelerator(),获取快捷键,void setAccelerator(KeyStroke),设置快捷键,void init(String,icon),用指定文本和图标初始化菜单项,void setEnabled(boolean),设置菜单的启动或禁止状态,MenuElement getSubElements(),获取菜单的子菜单项,51,8.2 Swing的常用组件,JCheckBoxMenuItem,JCheckBoxMenuItem的构造方法有如下几种:,JCheckBoxMenuItem():创建空复选框菜单项。,JCheckBoxMenuItem(Icon icon):创建具有特定图标的未选定复选框菜单项。,JCheckBoxMenuItem(String text):创建具有特定文本信息的未选定的复选框菜单项。,JCheckBoxMenuItem(String text,boolean b):创建具有特定文本信息和指定选择状态的复选框菜单项。,JCheckBoxMenuItem(String text,Icon icon):创建具有特定文本和图标的复选框菜单项,并且该菜单项为未选状态。,JCheckBoxMenuItem(String text,Icon icon,boolean b):创建具有特定文本和指定选择状态的复选框。,52,8.2 Swing的常用组件,JRadioButtonMenuItem,JRadioButtonMenuItem的构造方法有如下几种:,JRadioButtonMenuItem():创建一个空按钮菜单项。,JRadioButtonMenuItem(Icon icon):创建一个特定图标的单选按钮菜单项。,JRadioButtonMenuItem(String text):创建具有特定文本的单选按钮菜单项。,JRadioButtonMenuItem(String text,Icon icon):创建具有特定文本和图标的单选菜单项。,JRadioButtonMenuItem(String text,boolean b):创建具有特定文本以及选定状态的单选菜单项。,JRadioButtonMenuItem(String text,Icon,boolean b):创建具有特定文本、图标以及选定状态的单选菜单项。,53,8.2 Swing的常用组件,例8.10 菜单制作的示例。,程序清单见程序,MenuProducerExample .java,,运行结果见图8-13,8-14.,8-13 运行菜单 8-14运行弹出菜单,54,8.2 Swing的常用组件,11. JTree,树形层次结构是一种常用的图形界面形式。通常在文件目录、书目索引、商品目录等应用中都会使用树形层次结构。Java语言中的Swing包提供一种高级组件JTree。通过它可以直接实现树形层次结构。Java中树形层次结构存在特殊性:有且只有一个节点是根节点(没有父节点),每一个节点只有一个父节点。,55,8.2 Swing的常用组件,JTree组件与其他的Swing组件一样,采用MVC模型。为了实现一种树形结构,首先是用TreeNode接口定义树的节点。然后,将利用已有的树节点创建树的模型。Swing工具集中提供了一个默认的树模型DefaultTreeModel,根据树的模型创建出树形结构。,(1),JTree的创建,JTree的对象可以通过下列的常用的构造方法来实现:,JTree():返回带有示例模型的 JTree。,JTree(TreeModel newModel):返回 JTree 的一个实例,它显示根节点 - 使用指定的数据模型创建树。,JTree(TreeNode root):返回一个 JTree,指定的 TreeNode 作为其根,它显示根节点。,JTree(TreeNode root, boolean asksAllowsChildren):返回一个 JTree,指定的 TreeNode 作为其根,它用指定的方式显示根节点,并确定节点是否为叶节点。,56,8.2 Swing的常用组件,例8.11 创建简单树形结构的示例。,程序清单见程序,JTreeExample,.java,,运行结果见图8-15.,8-15,57,8.2 Swing的常用组件,JTable,Swing工具集的JTable组件可以实现二维表格。该组件是一种遵循MVC模型的高级组件,它利用接口TableModel定义表格模型,实现获取表格数据代理。JTable确定表格模型TableModel的视图。一般,建立简单的二维表格可以通过实现TableModel接口的DefaultTableModel类来定义表格模型。然后根据表格模型创建表格。,58,8.2 Swing的常用组件,JTable对象的创建,创建JTable对象可以通过下列的构造方法实现:,(1)JTable():构造默认的 JTable,使用默认的数据模型、默认的列模型和默认的选择模型对其进行初始化。,(2)JTable(int numRows, int numColumns):使用 DefaultTableModel 创建具有空单元格的 numRows 行和 numColumns 列的 JTable对象。,(3)JTable(Object rowData, Object columnNames):创建JTable对象,用来显示二维数组 rowData 中的值,其列名称为 columnNames。,(4)JTable(TableModel model):创建JTable对象,使用 model 作为数据模型、默认的列模型和默认的选择模型对其进行初始化。,(5)JTable(TableModel model, TableColumnModel cm):创建JTable对象,使用 model 作为数据模型、cm 作为列模型和默认的选择模型对其进行初始化。,59,8.2 Swing的常用组件,例8.12 创建简单表格的示例。,程序清单见程序,JTableExample,.java,,运行结果见图8-16.,8-16,60,8.3 布局管理器,Java语言将GUI组件放置在容器内和布局管理分成功能独立的两部分。容器中可以放置GUI组件,但是容器本身并不管理已容纳GUI组件的布局。而利用布局管理器来管理GUI组件在容器中的布局。实际上,Java语言的java.awt包中定义了一个布局管理器接口LayoutManager,通过实现该接口可以实现组件的布局。,常用实现LayoutManager布局管理器接口的常用类有FlowLayout、BorderLayout、CardLayout、GridLayout、GridBagLayout。以及利用null布局管理方式实现手工布局。,61,8.3 布局管理器,1.,流布局管理器,类FlowLayout是流布局管理器。这种管理器的特点是,组件在容器内依照指定方向按照组件添加的顺序依次加入到容器中。这个指定方向取决于FlowLayout管理器的组件方向属性。该属性有两种可能:从左到右方向和从右向左方向。在默认情况下,这个指定方向是从左到右的。许多的容器采用流布局管理器作为默认布局管理方式,如JPanel。,62,8.3 布局管理器,例8.13 FlowLayout的示例。,程序清单见程序,FlowLayoutExample.java,,运行结果见图8-17.,图8-17,63,8.3 布局管理器,2.,边界布局管理器,AWT包的类BorderLayout可以创建边界布局管理器。边界布局管理器可以将容器分成东(BorderLayout.EAST)、西(BorderLayout.WEST)、南(BorderLayout.SOUTH)、北(BorderLayout.NORTH)、中(BorderLayout.CENTER)五个区域,这五个区域中最多可以放置一个GUI组件。GUI组件可以按照指定的位置在这五个区域中选择其一布局,如果没有指定位置放置GUI组件,边界布局管理器会将该组件放置到容器的中央位置(BorderLayout.CENTER)。边界布局管理器也是JFrame与JApplet的默认布局方式。,64,8.3 布局管理器,8.14 BorderLayout的示例。,程序清单见程序,BorderLayoutExample.java,,运行结果见图8-18.,图8-18,65,8.3 布局管理器,3.,卡片布局管理器,卡片布局管理器能将容器中的组件看成不同的卡片层叠排列,每次只能显示一张卡片。每张卡片只能容纳一个组件。初次显示时,显示的是第一张卡片。卡片布局管理器是通过AWT包的类CardLayout来创建的。,例8.15 CardLayout的示例。,程序清单见程序,CardLayoutExample.java,,运行结果见图8-19.,图8-19,66,8.3 布局管理器,4.,网格布局管理器,网格布局是一种常用的布局方式,将容器的区域被划分成矩形网格,每个矩形大小规格一致,组件可以放置在其中的一个矩形中。Java语言中通过java.awt.GridLayout类创建网格布局管理器对象,实现对容器中的各组件的网格布局排列。具体的排列方向取决于容器的组件方向属性,组件方向属性有两种:从左向右和从右向左。用户可以根据实际要求进行设定方向属性,默认的方向是从右向左。,67,8.3 布局管理器,例8.16 GridLayout的示例。,程序清单见程序,GridLayoutExample.java,,运行结果见图8-20.,图8-20,68,8.3 布局管理器,5.网格包布局管理器,类GridBagLayout创建的网格包布局管理器,与网格布局管理器类似,它可以将容器的显示区域分成很多矩形网格。不同的是,网格包布局管理器使每个GUI组件可以占用一个或多个矩形网格。,为了实现网格包布局,不但需要类GridBagLayout,而且需要创建GridConstraints(网格包约束)对象。具体步骤是:(1)创建组件和网格包布局管理器对象;,(2)创建网格包约束GridBagConstraints对象,通过设置和组件有关的的GridBagConstraints对象的属性来限定组件占据空间;,(3)然后调用GridBagLayout的setContraints()法将组件与此GridBagConstraints对象关联;,(4)最后再将各组件加入容器中。,69,8.3 布局管理器,GridBagConstraints,(1)GridBagConstraints对象的创建,类GridBagConstraints提供两个构造方法来创建网格包约束对象:,GridBagConstraints():创建网格包约束对象,所有的对象属性采用默认属性。,GridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor, int fill, Insets insets, int ipadx, int ipady):创建指定属性的网格包约束对象。,70,8.3 布局管理器,71,8.3 布局管理器,(2)GridBagConstraints对象的常见属性,在这里介绍GridBagConstraints对象的常见属性:,gridx和gridy:设置容器显示区的左上角的位置。二者都有一个默认值GridBagConstraints.RELATIVE。如果gridx的值为RELATIVE,表示新添的组件放置到最后添加组件的右边;如果gridy的值为RELATIVE,则表示新添的组件放置到最后添加组件的下一行。,72,8.3 布局管理器,gridwidth和gridheight:表示组件显示区的行数和列数。它们可以直接指定函数和列数的大小,也可以选取GridBagConstraints.RELATIVE和GridBagConstraints.REMAINDER。,GridBagConstraints.REMAINDER是默认的取值,如果gridweight取它,表示新组件占据行剩余的所有空间;如果gridheight取REMAINDER,则表示新组件是当前列的最后一个组件。,至于RELATIVE值表示相对位置,即,如果gridweight取RELATIVE,表示新组件是当前行组件的下一个组件;如果gridheight取RELATIVE,表示新组件是当前列组件的后一个。,73,8.3 布局管理器,weightx和heighty:表示组件的权值,即,组件相对于其他组件的重量。它们决定了该如何处理剩余空间。weightx和weighty是0.01.0之间的一个double值。如果weightx取值为1.0,则表示组件会占据剩余空间的行位置;如果weighty的取值为0.0,则表示组件不占据剩余空间。,没有设定,weightx,heightx,74,8.3 布局管理器,设定,weightx,heightx,75,8.3 布局管理器,fill:设置组件填充方式。该属性特指一种情况:即,组件的大小小于分配给定空间,fill属性可以重新调整组件的大小。fill属性可以有以下几种:,GridBagConstraints.NONE:不调整组件的大小。,GridBagConstraints. HORIZONTAL:将组件在水平方向填充分配的显示区域,但宽度不发生变化。,GridBagConstraints. VERTICAL:将组件在垂直方向填充分配的显示区域,但高度不发生变化。,GridBagConstraints.BOTH:将组件在水平和垂直方向填充显示区域。,76,8.3 布局管理器,anchor,当组件小于其显示区域时使用此字段。它可以确定在显示区域中放置组件的位置。 可能的值有三种:,相对于方向的值,是相对于容器的组件方向属性进行解释的,方向相对值有:PAGE_START、PAGE_END、LINE_START、LINE_END、FIRST_LINE_START、FIRST_LINE_END、LAST_LINE_START 和 LAST_LINE_END。,相对于基线值,是相对于基线进行解释的,相对于基线的值有:BASELINE、BASELINE_LEADING、BASELINE_TRAILING、ABOVE_BASELINE、ABOVE_BASELINE_LEADING、ABOVE_BASELINE_TRAILING、BELOW_BASELINE、BELOW_BASELINE_LEADING 和 BELOW_BASELINE_TRAILING。默认值为 CENTER。,绝对值,则不然。绝对值有:CENTER、NORTH、NORTHEAST、EAST、SOUTHEAST、SOUTH、SOUTHWEST、WEST 和 NORTHWEST。,77,8.3 布局管理器,insets,此字段指定组件的外部填充,即组件与其显示区域边缘之间间距的最小量。,默认值为 new Insets(0, 0, 0, 0)。,ipadx和ipady,ipadx此字段指定组件的内部填充,即给组件的最小宽度添加多大的空间。组件的宽度至少为其最小宽度加上 ipadx 像素。,ipady此字段指定内部填充,即给组件的最小高度添加多大的空间。组件的高度至少为其最小高度加上 ipady 像素。,78,8.3 布局管理器,GridBagLayout layout=new GridBagLayout();,setLayout(layout);,GridBagConstraints constraints=new GridBagConstraints();,Label stuLabel=new Label(“学号”);,constraints.gridx=0;,constraints.gridy=0;,constraints.gridweight=1;,constraints.gridheight=1;,layout.setConstraints(stuLabel,constraints);,add(stuLabel);,TextField txtField=new TextField(10);,constraints.gridx=1;,constr
展开阅读全文