资源描述
第5章 图形界面设计(一)
本章重点:框架窗口,按钮事件处理方法,面板和滚动面板,布局设计,文本框事件的处理方法,以及利用文本框和文本区作数据输入输出的方法。
本章难点:按钮事件和文本框事件的处理方法。
5.1 图形界面设计基础
早先程序使用最简单的输入输出方式,用户在键盘输入数据,程序将信息输出在屏幕上。现代程序要求使用图形用户界面(Graphics User Interface,简称GUI),界面中有菜单、按钮等,用户通过鼠标选择菜单中的选项和点击按钮,命令程序执行功能模块。本章学习如何用Java语言编写GUI程序,如何通过GUI实现输入和输出。
5.1.1 AWT和Swing
先前用Java编写GUI程序,是使用抽象窗口工具包AWT(Abstract Windowing Toolkit,抽象窗口工具包)。现在多用Swing。Swing可以看作是AWT的改良版,而不是代替AWT,是对AWT的提高和扩展。所以,在写GUI程序时,Swing和AWT都有使用。它们共存于Java基础类(Java Foundation Class,JFC)中。
尽管AWT和Swing都提供了构造图形界面元素的类,但它们的重要方面有所不同:AWT依赖于主平台绘制用户界面组件;而Swing有自己的机制,在主平台提供的窗口中绘制和管理界面组件。Swing与AWT之间的最明显的区别是界面组件的外观,AWT在不同平台上运行相同的程序,界面的外观和风格会有一些差异。然而,一个基于Swing的应用程序可能在任何平台上都会有相同的外观和风格。
Swing中的类是从AWT继承的,参见图5.1。有些Swing类直接扩展AWT中的对应的类。例如,Japple、Jdialog、Jframe和Jwindow。
Java.awt
Java.lang
JWindow
JDialog
JFrame
JComponent
JApplet
Javax.swing
Dialog
Window
Applet
Panel
Container
Component
Object
Frame
图5-1 AWT和Swing的类层次结构
使用Swing设计图形界面,主要引入两个包:
l Javax.Swing包含Swing的基本类;
l Java.Awt.event包含与处理事件相关的接口和类。
由于Swing太丰富,不可能在一本教科书中给出Swing的全面介绍,但本书所介绍的有关Swing的知识,已足以让读者编写相当精美的GUI程序。
5.1.2 组件和容器
组件(Component)是图形界面的基本元素,用户可以直接操作,例如按钮。
容器(Container)是图形界面的复合元素,容器可以包含组件,例如面板。
Java语言为每种组件都预定义类,程序通过它们或它们的子类创建各种组件对象。例如,Swing中预定义的按钮类Jbutton是一种组件类,程序创建的Jbutton对象,或Jbutton子类的对象就是按钮。Java语言也为每种容器预定义类,程序通过它们或它们的子类创建各种容器对象。例如,Swing中预定义的窗口类Jframe是一种容器类,程序创建的Jframe或Jframe子类的对象就是窗口。
为了统一管理组件和容器,为所以组件类定义超类Component类,把组件的共有操作都定义在Component类中。同样,为所有容器类定义超类Container类,把容器的共有操作都定义在Container类中。例如,Container类中定义了add()方法,大多数容器都可以用add()方法向容器添加组件。
Component、Container和Graphic类是AWT库中的关键字,其中Graphic类将在第7章中介绍。为能层次地构造复杂的图形界面,容器被当作特殊的组件,可以把容器放入另一个容器这种。例如,把若干按钮和文本框分放在两个面板中,再把这两个面板和另一些按钮放入窗口中。这种层次地构造界面的方法,能以增量的方法构造复杂的用户界面。
图5.2示意Swing提供的GUI组件类和容器类,以及它们之间的继承关系。组件和容器从功能上可以粗分如下:
JCheckBoxMenuItem
Jbutton
AbstractButton
Jmenu
JmenuItem
JComboBox
JRadioButtonMenuItem
JLabel
JCheckBox
JToggleButton
JList
JRadioButton
JProgressBar
JMenuBar
JComponent
JPanel
JPopupMenu
JScrollBar
JScrollPane
JTextArea
JSeparator
JTextField
JTextComponent
JPasswordField
图5.2 Swing类的层次结构
顶层容器:Jframe,Japplet,Jdialog,Jwindow。
中间容器:Jpanel,JscrollPane,JSplitPane,JToolBar等。
基本控件:JButton,JComboBox,JMenu,JTextField。
可编辑组件:JColorChooser,JFileChooser,JTextArea。
5.1.3 事件驱动程序设计基础
编写事件驱动程序需要掌握以下几个重要的概念。
1. 事件、监视器和监视器注册
图形界面上的事件是指在某个组件上发生用户操作。例如,用户单击了界面上的某个按钮,就说在这个按钮上发生了事件,这个按钮对象就是事件的击发者。对事件作监视的对象称为监视器,监视器提供响应事件的处理方法。为了让监视器与事件对象关联起来,需要对事件对象作监视器注册,告诉系统事件对象的监视器。
以程序响应按钮事件为例,参见5.3.2节关于按钮事件处理方法的介绍。程序要创建按钮对象,把它添加到界面中,要为按钮作监视器注册,程序要有响应按钮事件的方法。当“单击按钮”事件发生时,系统就调用已为这个按钮注册的事件处理方法,完成处理按钮事件的工作。
2. 实现事件处理的途征
Java语言编写事件处理程序主要有两种方案:一个是程序重设方法handleEvent(Event evt),采用这个方案的程序工作量稍大一些。另一个方案是程序实现一些系统设定的接口。Java按事件类型提供多种接口,作为监视器对象的类需要实现相应的接口,即实现响应事件的方法。当事件方式时,系统内设的handleEvent(Event evt)方法就自动调用监视器的类实现的响应事件的方法。
Java·awt·event包中用来检测并对事件做出反应的模型包括以下三个组成元素:
(1) 源对象:事件“发生”在这个组件上,它与一组“侦听”该事件的对象保存着联系。
(2) 监视器对象:是一个实现预定义的接口的类的一个对象,该对象的类要提供对发生的事件作处理的方法。
(3) 事件对象:它包含描述当事件发生时从源传递给监视器的特定事件的信息。
一个事件驱动程序要做的工作除创建源对象和监视器对象之外,还必须安排监视器了解源对象,或向源对象注册监视器。每个源对象有一个已注册的监视器列表,提供一个方法能向该列表添加监视器对象。只有在源对象注册了监视器之后,系统才会将源对象上发生的事件通知监视器对象。
3. 事件类型和监视器接口
在Java语言中,为了方便系统管理事件,也为了便于程序作监视器注册,系统将事件分类,称为事件类型。系统为每个事件类型提供一个接口。要作为监视器对象的类必须实现相应的接口,提供接口规定的响应事件的方法。
再以程序响应按钮事件为例,Jbutton类的对象button可以是一个事件的激发者。当用户点击用户界面中与button对应的按钮时,button对象就会产生一个ActionEvent类型的事件。如果监视器对象是obj,对象obj的类是Obj,则类Obj必须实现AWT中的ActionListener接口,实现监视按钮事件的actionPerformed方法。Button对象必须用addActionListener方法注册它的监视器对象obj。
程序运行时,当用户点击button对象对应的按钮时,系统就将一个ActionEvent对象从事件激发对象传递到监视器。ActionEvent对象包含的信息包括事件发生在哪一个按钮,以及有关该事件的其它信息。
表5-1给出有一定代表性的事件类型和产生这些事件的部分Swing组件。实际事件发生时,通常会产生一系列的事件,例如,用户点击按钮,会产生ChangeEvent事件提示光标到了按钮上,接着又是一个ChangeEvent事件表示鼠标被按下,然后是ActionEvent事件表示鼠标已松开,但光标依旧在按钮上,最后是ChangeEvent事件,表示光标已离开按钮。但是应用程序通常只处理按下按钮的完整动作的单个ActionEvent事件。
表5-1 组件和事件类型
事件类型
组 件
描 述
ActionEvent
Jbutton、JcheekBox
点击、选项或选择
JcomboBox、JmenuItem
JradioButton
ChangeEvent
Jslider
调整一个可移动元素的位置
ItemEvent
JcomboBox、JcheckBox
从一组可选方案中
JradioButton
JradioButtonMenuItem
选择一个项目
JcheckBoxMenuItem
KeyEvent
Jcomponent及其派生类
操纵鼠标或键盘
MouseEvent
CareEvent
JtextArea、JtextField
选择和编辑文本
WindowEvent
Window及其派生类
对窗口打开、关闭和图标化
每个事件类型都有一个相应的监视器接口,表5-2列出了每个接口的方法。实现监视器接口的类必须实现所有定义在接口中的方法。
表5-2 监视器接口方法
监视器接口
方 法
ActionListener
actionPerformed
ChangeListener
stateChanged
FocusListener
FocusGained、focusLost
ItemListener
ItemStateChanged
KeyListener
keyPressed,keyReleased,keyTyped
CareListener
careUpdate
MouseListener
mouseClicked,
mouseExited,mousePresed,
mouseReleased,
MouseMotionListener
mouseDragged,mouseMoved
WindowListener
windowClosed,windowClosing,
windowDeactivated,windowDeiconified,
windowIconified,windowOpened
事件驱动程序的实际例子请参见以后各小节含事件处理的实际程序。
5.2 框架窗口
窗口是GUI编程的基础,小应用程序或图形界面的应用程序的可视组件都放在窗口中。在GUI中,窗口是用户屏幕的一部分,起着在屏幕中一个小屏幕的作用。有以下三种窗口:
(1) Applet窗口,Applet类管理这个窗口,当小应用程序启动时,由系统创建和处理。
(2) 框架窗口(JFrame),这是通常意义上的窗口,它支持窗口周边的框架、标题栏,以及最小化、最大化和关闭按钮。
(3) 一种无边框窗口(JWindow),没有标题栏,没有框架,只是一个空的矩形。
用Swing中的Jframe类或它的子类创建的对象就是Jframe窗口。
JFrame类的主要构造方法:
① JFrame(),创建无标题的窗口对象。
② JFrame(String s),创建一个标题名是字符串s的窗口对象。
Jframe类的其它常用方法:
① setBounds(int x,int y,int width,int height),参数x,y指定窗口出现在屏幕的位置;参数width,height指定窗口的宽度和高度。单位是像素。
② setSize(int width,int height),设置窗口的大小,参数width,height指定窗口的宽度和高度,单位是像素。
③ setBackground(Color c),以参数c设置窗口的背景颜色。
④ setVisible(boolean b),参数b设置窗口是可见或不可见。
⑤ pack(),用紧凑方式显示窗口。如果不使用该方法,窗口初始出现时可能看不到窗口中的组件,当用户调整窗口的大小时,可能才能看到这些组件。
⑥ setTitle(String name),以参数name设置窗口的名字。
⑦ getTitle(),获取窗口的名字。
⑧ setResizable(boolean m),设置当前窗口是否可调整大小(默认可调整大小)。
注意:
Swing里的容器都可以添加组件,除了Jpanel及其子类(如Japplet)之外,其它的Swing容器不允许把组件直接加入。其它容器添加组件有两种方法:
(1) 用getContentPane()方法获得内容面板,再将组件加入。例如,例5.1程序中的代码:
mw. getContentPane().add(button);
该代码的意义是获得容器的内容面板,并将按钮button添加到这个内容面板中。
(2) 建立一个Jpanel对象的中间容器,把组件添加到这个容器中,再利用setContentPane()把这个容器置为内容面板。例如,代码:
Jpanel contentPane=new Jpanel; //创建面板
···
mw.setContentPane(ContentPane); //把一些组件添加到contentPane中
以上代码把ContentPane置成内容面板。
【例5.1】
用JFrame类创建窗口的Java应用程序。窗口只有一个按钮,参见图5.3。程序的第一行代码指明程序使用Swing库。在main()方法中,对象mw是一个JFrame对象,一个JFrame对象是一个很简单的窗口,它有标题,有窗口关闭按钮等。下一行代码是设定窗口的大小,接着是创建一个按钮对象。下一行的代码略为复杂,其作用是将按钮对象添加到窗口mw上,参见5.3节。方法setContentPane()是JFrame类的方法,获取窗口的内容面板ContentPane。每个JFrame对象都有一个放置窗口组件的内容面板。通常不是将窗口的组件直接加到JFrame中,而是添加到它的内容面板中。所以代码mw. getContentPane().add(button)是获得窗口mw的内容面板,并将按钮添加在这个内容面板上。最后一行代码使窗口mw在屏幕上可见,没有这一行代码,或用代码mw.setVisible(false)将使窗口不可见。
图5.3
package Example5pack;
import javax.swing.*;
public class Example5_1
{
创建一个窗口容器对象。
public static void main(String[] args)
{
设定窗口的宽度和窗口的高,单位是像素
JFrame mw=new JFrame("我的第一个窗口");
mw.setSize(250, 200);
JButton button=new JButton("我是一个按钮");
mw.getContentPane().add(button);
mw.setVisible(true);
获得窗口的内容面板,并将按钮添加在这个内容面板中
}
}
用Swing编写GUI程序时,通常不直接用JFrame创建窗口对象,而用JFrame派生的子类创建窗口对象,在子类中可以加入窗口的特定要求和特别的内容等。
【例5.2】
定义JFrame派生的子类MyWindowDemo创建JFrame窗口。类MyWindowDemo的构造方法有5个参数:窗口标题名,加入窗口的组件,窗口的背景颜色以及窗口的高度和宽度。在主方法中,利用类MyWindowDemo创建两个类似的窗口。
package Example5pack;
import javax.swing.*;import java.awt.*;import java.awt.event.*;
public class Example5_2
{
public static MyWindowDemo mw1;
public static MyWindowDemo mw2;
public static void main(String args[])
{
JButton butt1 = new JButton("我是一个按钮");
String name1 = "我是第一个窗口";
String name2 = "我是第二个窗口";
mw1=new MyWindowDemo(name1,butt1,Color.BLUE,350,450);
mw1.setVisible(true);
JButton butt2 = new JButton("我是另一个按钮");
mw2=new MyWindowDemo(name2,butt2,Color.magenta,300,400);
mw2.setVisible(true);
}
}
class MyWindowDemo extends JFrame
{
public MyWindowDemo(String name,JButton button,Color c,int w,int h)
获得窗口内容面板
{
super();setTitle(name);setSize(w,h);
Container contentPane=getContentPane();
将按钮添加在内容面板中
contentPane.add(button);
contentPane.setBackground(c);
设置背景颜色
}
}
显示颜色由java.awt包的color类管理,在Color类中预定义了一些常用的颜色,参见表7-1。JFrame类的部分常用方法参见表5-3。
表5-3 JFrame类的部分常用方法
方法
意义
JFrame()
构造方法,创建一个JFrame对象
JFrame(String title)
创建一个以title为标题的JFrame对象
add()
从父类继承的方法,向窗口添加窗口元素
void addWindowListener(WindowListener ear)
注册监视器,监听由JFrame对象击发的事件
Container getContentPane()
返回JFrame对象的内容面板
void setBackground(Color c)
设置背景色为c
void setForeground(Color c)
设置前景色为c
void setSize(int w,int h)
设置窗口的宽为w,高为h
void setTitle(String title)
设置窗口标题
void setVisible(boolean)
设置窗口的可见性,true可见,false不可见
5.3 标签、按钮和按钮事件
标签和按钮也许是图形界面中最常见的两种,按钮又总是与激发动作事件有关。
5.3.1 标签
标签(JLabel)是最简单的Swing组件。标签对象的作用是对位于其后的界面组件作声明。可以设置标签的属性,即其前景颜色、背景颜色、字体等等,但不能动态地编辑标签中的文本。
程序关于标签的基本内容有以下几个方面:
(1) 声明一个标签名
(2) 创建一个标签对象
(3) 将标签对象加入到某个容器
Jlabel类的主要构造方法是:
(1) JLabel(),构造一个显示文字的标签。
(2) Jlabel(String s),构造一个显示文字为s的标签。
(3) JLabel(String s,int align),构造一个显示文字为s的标签。Align为显示文字的水平对齐方式。对齐方式有三种,以下三个常量分别表示显示文字左对齐、中心对齐和右对齐。
Jlabel.LEFT、Jlabel.CENTER、Jlabel.RIGHT
JLabel类的其他常用方法是:
(1) srtText(String s),设置标签显示文字。
(2) getText(),获取标签显示文字。
(3) setBackground(Color c),设置标签的背景颜色,标签的默认背景颜色是容器的背景颜色。
(4) setForeground(color c),设置标签的前景颜色,默认颜色是黑色。
5.3.2 按钮
按钮(JButton)在界面设计中用于激发动作事件。按钮可显示文本,当按钮被激活时(鼠标点击),能激发动作事件。
JButton类的常用构造方法:
(1) Jbutton(),创建一个没有标题的按钮对象。
(2) Jbutton(String s),创建一个标题为s的按钮对象。
JButton类的其他常用方法:
(1) setLabel(),设置按钮的标题文字。
(2) getLabel(String s),获取按钮的标题文字。
(3) setMnemonic(char mnemonic),设置热键。
(4) setToolTipText(String s),设置提示文字。
(5) setEnabled(boolean b),设置是否响应事件。
(6) setRolloverEnabled(boolean aL),设置是否滚动。
(7) addActionListener(ActionEvent aL),向按钮添加动作监视器。
(8) removeActionListener(ActionListener aL),移去按钮的监视器。
按钮处理程序的基本内容有以下几个方面:
(1) 与按钮动作事件相关的接口是ActionListener。给出实现该接口的类的定义。
(2) 声明一个按钮名。
(3) 创建一个按钮对象。
(4) 将按钮对象加入某个容器。
(5) 为需要控制的按钮对象注册监视器,对在这个按钮上产生的事件实施监听。
如果是按钮对象所在的类实现监视接口,注册监视器的代码形式是:
addActionListener(this);
参见例5.3。如果是别的类A的对象a作为监视器,类A必须实现ActionListener接口,完成监视器注册需用以下形式的两行代码:
A a=new A(); //创建类A的实例a
addActionListener(a); //用对象a作为监视器对事件进行监视
(6) 在实现接口ActionListener的类中,给出处理事件的方法的定义:
public void actionPerformed(ActionEvent e)。
在处理事件的方法中,用获得事件源信息的方法获得事件源信息,并判断和完成相应处理。获得事件源的方法有:方法getSource()获得事件源对象;方法getActionCommand()获得事件源按钮的文字信息。
【例5.3】处理按钮事件实例。应用程序定义了一个窗口,窗口内设置了两个按钮,当点击Red按钮时,窗口的背景色设置成红色;点击Green按钮时,窗口的背景色置成绿色。参见图5.4。
import javax.swing.*;import java.awt.*;import java.awt.event.*;
创建一个窗口
public class Example5_1 {
public static void main(String args[]){
给出实现(定义)该接口的类的定义。处理事件的方法要包含到这个接口类中。
ButtonDemo myButtonGUI=new ButtonDemo();
myButtonGUI.setVisible(true);
}
}
class ButtonDemo extends JFrame implements ActionListener{
public static final int Width =250;
public static final int Height=200;
获取窗口对象“ButtonDemo”的内容面板,并给该内容面板起一个名字“conPan”。
ButtonDemo(){
String qq="按钮事件样例";
setSize(Width,Height);
setTitle(qq);
Container conPane=getContentPane();
conPane.setBackground(Color.BLUE);
采用FlowLayout布局
conPane.setLayout(new FlowLayout());
给Red按钮注册监视器(监听者)
JButton redBut=new JButton("Red");
redBut.addActionListener(this);
把按钮添加到内容面板中,
conPane.add(redBut);
JButton greenBut=new JButton("Green");
实现(定义)接口处理事件的方法
greenBut.addActionListener(this);
conPane.add(greenBut);
}
public void actionPerformed(ActionEvent e){
Container conPane=getContentPane();
if(e.getActionCommand().equals("Red"))
conPane.setBackground(Color.red);
else
if(e.getActionCommand().equals("Green"))
conPane.setBackground(Color.GREEN);
else {}
}
图5.4 例5.3程序界面
}
用鼠标点击按钮产生事件对象,将事件送达监视器对象,这个过程称为激发事件。当一个事件被送到监视器对象时,监视器对象实现的接口方法被调用,调用时系统会提供事件对象的参数。程序中虽然没有调用监视器方法的代码,但是程序做了两件事:
第一,指定哪一个对象是监视器,它将响应由按钮激发的事件,这个步骤称为监视器注册。
第二,必须定义一个方法,当事件送到监视器时,这个方法被调用。
程序中没有调用这个方法的代码,这个调用是系统执行的。
在上面的程序中,代码
redBut.addActionListener(this);
注册this作为redBut按钮的监视器,随后的代码也注册this作为greenBut按钮的监视器。在上述程序中,this就是当前的ButtonDemo类的对象myButtonGUI。这样,ButtonDemo类就是监视器对象的类,对象myButtonGUI作为两个按钮的监视器。在类ButtonDemo中有监视器方法的实现。当一个按钮被点击时,系统以事件的激发者为参数,自动调用方法actionPerformed()
组件不同,激发的事件种类也不同,监视器类的种类也不同。按钮激发的事件称为action事件,相应的监视器称为action监视器。一个action监视器对象的类型为ActionListener,类要实现ActionListener接口。程序体现这些内容需要做的两点:
(1) 在类定义的首行接上代码implements ActionListener;
(2) 类内定义方法actionPerformed()。
前面程序中的类ButtonDemo正确地做到了这两点。
每个界面元素当激发事件时,都有一个字符串与这个事件相对应,这个字符串称为action命令。用代码e.getActionCommand()就能获取action事件参数e的命令字符串,据此,方法actionPerformed()就能知道是哪一个激发的事件。在默认情况下,按钮的命令字符串就是按钮上的文字。如有必要可以用方法setActionCommand()为界面组件设置命令字符串。
5.4 面板
面板有两种,一种是普通面板JPanel,另一种是滚动面板JscrollPane。
5.4.1 JPanel
面板(JPanel)是一种通用容器,JPanel的作用是实现界面的层次结构,在它上面可以放置一些组件,也可以在上面绘画,将放有组件和有画的JPanel再放入另一个容器里。JPanel的默认布局为FlowLayout。
面板处理程序的基本内容有以下几个方面:
(1) 通过继承声明JPanel类的子类,子类中有一些组件,并在构造方法中将组件加入面板。
(2) 声明JPanel子类对象。
(3) 创建JPanel子类对象
(4) 将JPanel子类对象加入到某个容器。
JPanel类的常用构造方法有:
(1) JPanel(),创建一个JPanel对象。
(2) JPanel(LayoutManager layout),创建JPanel对象时指定布局layout。
JPanel对象条件组件的方法:
(1) add(组件),添加组件。
(2) add(字符串,组件),当面板采用CordLayout布局时,字符串是引用添加组件的代码。
【例5.4】小应用程序有两个JPanel子类对象和一个按钮。每个JPanel子类对象又有两个按钮和一个标签。参见图5.5。
import java.applet.*;
import javax.swing.*;
class MyPanel extends JPanel{
JButton button1,button2;
JLabel label;
MyPanel(String s1,String s2,String s3){
button1=new JButton(s1);
button2=new JButton(s2);
label=new JLabel(s3);
add(button1);add(button2);add(label);
}
}
public class Example5_4 extends Applet{
MyPanel panel1,panel2;
JButton button;
public void init(){
panel1=new MyPanel("确定","取消","标签,我们在面板1中");
panel2=new MyPanel("确定","取消","标签,我们在面板2中");
button=new JButton("我是不在面板中的按钮");
add(panel1);add(panel2);add(button);
setSize(300,200);
}
}
图5.5 例5.4程序的界面
5.4.2 JScrollPane
当一个容器内放置了许多组件,而容器的显示区域不足以同时显示所有组件时,如果让容器带滚动条,通过移动滚动条的滑块,容器中其他位置上的组件就能看到。滚动面板JscrollPane就能实现这样的要求,JscrollPane是带有滚动条的面板。JscrollPane是Container类的子类,也是一种容器,但是只能添加一个组件。JscrollPane的一般用法是先将一些组件添加到一个JPanel中,然后再把这个JPanel添加到JscrollPane中。这样,从界面上看,在滚动面板上,好像也有多个组件。在Swing中,像JTextArea、Jlist、JTable等组件都没有自带滚动条,都需要将它们放置于滚动面板,利用滚动面板的滚动条浏览组件中的内容。
JscrollPane类构造方法有:
(1) JScrollPane(),先创建JScrollPane对象,然后再用方法setViewPortView(component com)为滚动面板对象放置组件对象。
(2) JScrollPane(Component com),创建JScrollPane对象,参数com是要放置于JScrollPane对象的组件对象。为JScrollPane对象指定了显示对象之后,再用add()方法将JScrollPane对象放置于窗口中。
JScrollPane对象设置滚动条的方法是:
(1) setHorizontalScrollBarPolicy(int policy),设置水平滚动条。policy取下列3个值之一:
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS,水平滚动条总是可见。
JScrollPane..HORIZONTAL_SCROLLBAR_AS_NEEDED,水平滚动条需要时才显示。
JScrollPane.HORIZONTAL_SCROLLBAR_NEVEN,水平滚动条总是不可见。
(2) setVerticalScrollBarPolicy(int policy),设置垂直滚动条。policy取下列3个值之一:
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,水平滚动条总是可见。
JScrollPane.VERTICAL _SCROLLBAR_AS_NEEDED,水平滚动条需要时才显示。
JScrollPane. VERTICAL _SCROLLBAR_NEVEN,水平滚动条总是不可见。
以下代码将文本区放置于滚动面板,滑动滚动面板的滚动条能浏览文本区(参见5.6.2):
JTextArea textA=new JTextArea(20,30);
JScrollPane jsp=new JScrollPane(textA);
getContentPane().add(jsp); //将含文本区的滚动面板加入到当前窗口中
进一步的程序例子见例5.6。
5.5 布局设计
在界面设计中,一个容器要放置许多组件,为了美观,为组件安排在容器中的位置,这就是布局设计。Java.awt中定义了多种布局类,每种布局类对应一种布局的策略。常用的有以下布局类:
FlowLayout,依次放置组件。
BorderLayout,将组件放置在边界上。
CardLayout,将组件像扑克牌一样叠放,而每次只能显示其中一个组件。
Gr
展开阅读全文