java swing基础与事件处理 博客分类: javaSE swing布局管理器事件处理容器组件
程序员文章站
2024-03-25 20:39:52
...
一、swing基础
1、平台无关性,无需依赖平台
容器:代表管理,可以添加组件
组件:代表功能
2、类层次结构
java.awt.Component
java.awt.Container
java.awt.Window
javax.swing.JWindow
java.awt.Frame——javax.swing.JFrame
java.awt.Dialog——javax.swing.JDialog
java.awt.Pane
java.awt.Applet——javax.swing.JApplet
javax.swing.JComponet——swing轻量级组件
3、swing组件分类
(1)顶层容器:
JFrame, JDialog, JApplet, JWindow
(2)普通容器:
JPanel, JScrollPane, JSplitPane,JTabbedPane,JOptionPane
(3)特殊容器:
JInternalFrame, JLayeredPane, JRootPane, JToolBar
(4)基本控件,实现人-机交互的组件:
JButton , JTextField, JLabel, JTextArea, JMenu, JSlider
JComboBox,JList ,JProgressBar, JToolTip
JColorChooser, JFileChooser, JTable, JTree
4、JFrame
(1)JFrame类的特性:
默认不可视;
默认宽高为0;
JFrame与JFrame不能相互嵌套
默认布局BorderLayout
(2)常用方法
JFrame();创建无标题窗口
JFrame(String s):创建一个有标题窗口
* get/setTitle(char s):获取/设置帧的标题,将s设置为窗口标题。
* get/setState():获取/设置帧的最小化、最大化等状态。
* is/setVisible(boolean b):获取/设置帧的可视状态
* get/setLocation(int a,int b):获取/设置帧在屏幕上应当出现的位置。 *get/setSize(int width,int height):获取/设置帧的大小。
*JFrame.setResizable(false/true):设置窗口的大小是否可被改变。
*setDefaultCloseOperation(int operation);设单击关闭图标后的响应,
operation可取下值 :
DO_NOTHING_ON_CLOSE 什么也不做
HIDE_ON_CLOSE 隐藏当前窗口
DISPOSE_ON_CLOSE 隐藏当前窗口,并彩旗窗体占有的其他资源
EXIT_ON_CLOSE 结束窗体所在应用程序
* add():将组件添加到帧中。
5、JDialog
(1)特性
必须依赖一个JFrame对象
常用构造方法: JDialog(JFrame f,String s);
JDialog具有和JFrame一样的特性;
JDialog分两种: 有模,无模;
(2)常用方法
setSize(200,200); //设置对话框窗口大小
setLocation(300,300); //设置对话框窗口位置
setVisible(true); //设置对话框窗口是否为可见
setModal(false); //设置对话框窗口模式
setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE)
6、JPanel
JPanel是JComponet的子类,因此JPanel是轻量级组件, 且JPanel可以容纳其它组件;我们称JPanel为中间容器;
(1)JPanel容器特性:
需加入JFrame才可见
默认可见;
默认布局: FlowLayout;
JPanel与JPanel可相互嵌套;
7、JScrollPane
产生滚动条
8、JSplitPane
Split Pane(分割面版)一次可将两个组件同时显示在两个显示区中,若你想要同时在多个显示区显示组件,你便必须同时使用多个Split Pane。JSplitPane提供两个常数让你设置到底是要水平分割还是垂直分割。这两个常数分别是:HORIZONTAL_SPIT,VERTICAL_SPLIT.
例子:
9、JTabbedPane 面板切换工具、标题面板
10、基本控件
(1)JButton生成按钮;常用方法:
public JButton(); public JButton(String tag);
public void setText(String tag);
public String getText();
(2)JTextField生成单行文本框;常用方法:
public JTextField();public JTextField(int cols);
public void setText(String tag);
public String getText();
(3)JLabel生成标签;常用方法:
public JLabel(); public JLabel(String tag);
public void setText(String tag);
public String getText();
(4)JPasswordField生成密码框;常用方法:
public JPasswordField(); public JPasswordField (int cols);
public void setText(String default);
public char[ ] getPassword();
public setEchoChar(char c)
(5)JTextArea生成多行文本框;常用方法:
public JTextArea(); public JTextArea(int rows, int cols)
public JTextArea(String text, int rows, int cols) ;
public void setText(String str);
public String getText();
public void append(String str);
11、通用方法
setIcon(Icon icon); //设置其上显示的图标.
setBackground(Color c); //设置背景色.
setForeground(Color c); //设置其上文字颜色.
setFont(Font font); //设置字体.
setPreferredSize(Dimension ds); //设置大小.
setBorder(Border bd); //设置边框.
setEnable(boolean b); //是否可用.
setEditable(boolean b); //是否可编辑
相关类如下:
Icon / ImageIcon //图标相关类
Icon icon1=new ImageIcon(“图片路径”);
Color //颜色相关类
Color color1=new Color(255,0,0); //红色
Font //字体相关类
Font font1=new Font(“隶书”, Font.BOLD,16);
Dimension //大小相关类
Dimension dim1=new Dimension(宽,高);
Border / BorderFactory //边框相关类
createTitledBorder(String title); //有标题边框
createBevelBorder(int type); //斜面边框
createLineBorder(Color color); //颜色边框
createEmptyBorder(int top, int left, int bottom, int right); // 空边框,用于产生边距
createCompoundBorder(Border out, Border in); //组合边框,将两个边框效果组合
12、JOptionPane模式对话框
ConfirmDialog --- 确认对话框,提出问题,然后由用户自己来确(按"Yes"或"No"按钮)
InputDialog --- 提示输入文本
MessageDialog --- 显示信息
OptionDialog -- 组合其它三个对话框类型。
这四个对话框可以采用showXXXDialog()来显示,如showConfirmDialog()显示确认对话框、showInputDialog()显示输入文本对话框、showMessageDialog()显示信息对话框、showOptionDialog()显示选择性的对话框。它们所使用的参数说明如下:
① ParentComponent:指示对话框的父窗口对象,一般为当前窗口。也可以为null即采用缺省的Frame作为父窗口,此时对话框将设置在屏幕的正中。
② message:指示要在对话框内显示的描述性的文字
③ String title:标题条文字串。
④ Component:在对话框内要显示的组件(如按钮)
⑤ Icon:在对话框内要显示的图标
⑥ messageType:一般可以为如下的值ERROR_MESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE、PLAIN_MESSAGE、
⑦ optionType:它决定在对话框的底部所要显示的按钮选项。一般可以为DEFAULT_OPTION、YES_NO_OPTION、YES_NO_CANCEL_OPTION、OK_CANCEL_OPTION。
使用实例:
(1) 显示MessageDialog
JOptionPane.showMessageDialog(null, "在对话框内显示的描述性的文字", "标题条文字串", JOptionPane.ERROR_MESSAGE);
(2) 显示ConfirmDialog
JOptionPane.showConfirmDialog(null, "choose one", "choose one", JOptionPane.YES_NO_OPTION);
(3) 显示OptionDialog:该种对话框可以由用户自己来设置各个按钮的个数并返回用户点击各个按钮的序号(从0开始计数)
Object[] options = {"确定","取消","帮助"}; int response=JOptionPane.showOptionDialog(this, "这是个选项对话框,用户可以选择自己的按钮的个数" , "选项对话框标题",JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if(response==0) { this.setTitle("您按下了第OK按钮 "); } else if(response==1) { this.setTitle("您按下了第Cancel按钮 "); } else if(response==2) { this.setTitle("您按下了第Help按钮 "); }
(4) 显示InputDialog 以便让用户进行输入
String inputValue = JOptionPane.showInputDialog("Please input a value");
(5) 显示InputDialog 以便让用户进行选择地输入
Object[] possibleValues = { "First", "Second", "Third" }; //用户的选择项目 Object selectedValue = JOptionPane.showInputDialog(null, "Choose one", "Input",JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); setTitle("您按下了"+(String)selectedValue+"项目");
二、布局管理器
---布局管理器(LayoutManager):每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。
---布局管理器种类:
FlowLayout: 组件在一行中从左至右水平排列,排满后折行,它是Panel、Applet的默认布局管理器。
BorderLayout:北、南、东、西、中,它是Window、Frame、Dialog的默认布局管理器。
GridLayout:以行和列的网格形式安排组件
GridBagLayout:更复杂、功能更强的网格布局
CardLayout:每一个组件作为一个卡片,容器仅显示多个卡片中的某一个确定容器布局
布局管理器
当一个窗口中的组件较多时,界面应该简洁整齐,布局合理。Java采用布局管理器对容器中的组件进行相对布局,当改变容器大小时,或者改变组件的大小,或者改变组件之间的相对位置,保证组件不会被覆盖并且容器没有空白区域。
Java提供多种风格和特点的布局管理器,每一种布局管理器指定一种组件之间的相对位置。Java.awt中的布局管理器类主要有:FlowLayout、BorderLayout和GridLayout。
布局是容器类的特性,每种容器都有一中默认布局。Window窗口类的默认布局管理器是BorderLayout,Panel面板类的默认布局是FlowLayout。如果一个容器需要改变其默认布局管理器,可以调用Container容器类的FlowLayout()方法。
1、 FlowLayout流布局管理器
FlowLayout布局管理器提供按行布置组件方式,将组件按从左到右顺序、一行一行地排列,当一行放满时再放置下一行。组件保持自己的尺寸,容器中一行的宽度随容器的宽度而变化。当改变容器大小时,组件的相对位置随容器大小而变化,将呈现一行或多行。
FlowLayout类的部分声明如下:
public class FlowLayout implements LayoutManager.jaca.io.Serializable{
public static final int LEFT=0; //左对齐
public static final int CENTER=1; // 居中
public static final int RIGHT=2; //右对齐
public FlowLayout() //构造方法,默认居中
public FlowLayout(int align) //align参数指定对齐方式
public FlowLayout(int align,int hgap,int vgap) //hgap、vgap指定组件间的水平和垂直间距
}
2、 BorderLayout边界布局管理器
BorderLayout布局管理器将容器划分为五个区域,东、南、西、北四条边和中间,组件占满一条边或中间部分。当改变容器大小时,四边组件的长度或宽度不变,中间组件的长度和宽度随着容器大小而变化。
BorderLayout类的部分声明如下:
public class BorderLayout implements LayoutManager2,java.io.Serializable{
public static final String NORTH="North";
public static final String SOUTH="South";
public static final String EAST="East";
public static final String WEST="West";
public static final String CENTER="Center";
public BorderLayout() //构造方法,组件之间的间距为0像素
public BorderLayout(int hgap,int vgap) //参数指定组件之间的水平和垂直间距(像素)
}
Container类为BorderLayout布局提供以下添加组件的方法:
public void add(Component comp,Object constraints)
其中,constrains参数指定组件添加到BorderLayout布局容器的位置,取值为BordetLayout类的常量,如BorderLayout.EAST或“South”。例如,下列语句将5个按钮一次放置在框架的5个区域中:
Frame frame =new Frame();
frame.add(new Button("东"),BorderLayout.EAST);
frame.add(new Button("南"),"South");
frame.add(new Button("西"),"West");
frame.add(new Button("北"),"North");
frame.add(new Button("中"),BorderLayout.CENTER); //可以省略为this.add(new Button("中"));
当constraints参数取值为BorderLayout.CENTER时,参数可以省略。如果将多个组件放置在同一个区域,则后放置组件将覆盖先放置的组件。
3、 GridLayout网格布局管理器
GridLayout布局管理器将容器划分为大小相等的若干行乘若干列的网格,组件从左至右,从上至下一次放入网格中。组件大小随容器大小而变化。如果组件数多于网格数,Java将自动增加网格;反之,一些网格将空置。
GridLayout类的部分声明如下:
public class GridLayout implements LayoutManager,java.io.Serializable{
public GridLayout()
public GridLayout(int rows,int cols)
public GridLayout(int rows,int cols,int hgap,int vgap)
}
GridLayout布局的组件放置次序是行优先,从第一行开始,从左至右依次放置,一行放满后自动转入下一行。如果组件数超过网格数,则布局管理器会自动增加网格数,增加的原则是保持行数不变。如果需要在指定位置放置组件,则可调用Container类为GridLayout布局提供以下方法:
public Component add(Component comp,int index)
例如:
Frame frame=new Frame();
frame.setLayout(new GridLayout(3,2)); //设置3行2列的网格布局
frame.add(new Button("botton1")); //依次添加组件
frame.add(new Button("botton2"),0); //将组件插入在指定位置
4、BoxLayout盒式布局
用BoxLayout类可以创建一个布局对象,称为盒式布局。BoxLayout在javax.swing.border包中。javax.swing包提供了Box类,该类创建的容器称作一个盒子式容器,盒式容器的默认布局就是盒式布局,而且不允许更改盒式容器的布局,使用盒子式布局的容器针组件排列在一行或一列;
常用方法:
//创建一个从左到右显示其组件的 Box。
public static Box createHorizontalBox()
//创建一个不可见的、固定宽度的组件。
public static Component createHorizontalStrut(int width)
//创建一个横向 glue 组件
public static Component createHorizontalGlue()
//创建一个从上到下显示其组件的 Box。
public static Box createVerticalBox()
//创建一个不可见的、固定高度的组件。
public static Component createVerticalStrut(int height)
//创建一个纵向 glue 组件。
public static Component createVerticalGlue()
//创建一个总是具有指定大小的不可见组件。
public static Component createRigidArea(Dimension d)
三、菜单相关类
JMenuBar //菜单条
JMenu //菜单
addSeparator(); //为菜单加分隔线
JMenuItem //菜单项
ButtonGroup/JRadioButtonMenuItem //单选框菜单
JFrame有setJMenuBar(JMenuBar mb)方法为窗体设置菜单.
菜单(JMenu)和菜单项(JMenuItem)都扩展了AbstractButton类。菜单和菜单项包含与许多Swing按钮相同的特性。比如,菜单项可以在鼠标经过时,高亮显示;可以被单击,表明用户做出了选择;可以像按钮一样被禁止使用。
复选菜单项(JCheckBoxMenuItem)与单选菜单项(JRadioButtonMenuItem)扩展了JMenuItem,其也具有与许多 Swing按钮相同的特性,如可以在选中与非选中状态之间进行切换。
JMenu扩展了JMenuItem类,每个JMenu对象都包含一个用做菜单标题的隐藏菜单项。菜单不一定出现在菜单栏上,其可以被嵌入其他的菜单中充当子菜单。菜单栏包含一个或多个菜单,其使用与平台相关的位置摆放,通常位于窗口的上方。
弹出式菜单(JPopupMenu)只有在用户执行了与平台相关的鼠标操作后才能出现。例如,在一个支持弹出式菜单的控件上用鼠标右键单击,在鼠标所在处将弹出快捷菜单。
例子:
四、皮肤设置
设置快捷键
setMnemonic( KeyEvent.VK_A )
设置皮肤(自己扩展)
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
// com.sun.java.swing.plaf.motif.MotifLookAndFeel
//com.sun.java.swing.plaf.windows.WindowsLookAndFeel
// javax.swing.plaf.metal.MetalLookAndFeel
} catch (Exception e) {
e.printStackTrace();
}
五、事件处理
1、事件处理涉及的三大对象
Event-事件,用户对界面操作在java语言上的描述,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。
Event Source-事件源,事件发生的场所,通常就是各个组件,例如按钮JButton。
Event handler-事件处理者,接收事件对象并对其进行处理的
2、监听器
监听器:ActionListener
方 法:actionPerformed
事 件:ActionEvent
● String getActionCommand()
actioncommand是控件内部的一个字符串,用于标识控件的状态。
此函数可以取得控件的状态,从而决定到底该做什么。
● int getModifiers()
取得“产生此事件时,用户同时按下的组合键”
● long getWhen()
取得“产生此事件时的时间戳”
事件产生原因:点击按钮,在列表框中选择内容,在文本框中点回车,计时器到期
------------------------------------------------------------------
监听器:AdjustmentListener
方 法:adjustmentValueChanged
事 件:AdjustmentEvent
● Adjustable getAdjustable()
adjustable是一个接口,各种滚动条都实现了这个接口。
● int getAdjustmentType()
取得滚动类型,共有UNIT_INCREMENT,UNIT_DECREMENT,BLOCK_INCREMENT,BLOCK_DECREMENT,TRACK共5种类型
● int getValue()
取得滚动滑块的当前值
事件产生原因:滚动条的滚动
------------------------------------------------------------------
监听器:ItemListener
方 法:itemStateChanged
事 件:ItemEvent
● Objedt getItem()
取得被选中的元素。注意,返回值是Object,还应该进行强制类型转换。
● ItemSelectable getItemSelectable()
ItemSelectable是一个接口,代表那些包含了n个可供选择的子元素的对象。此方法返回产生此事件的对象。此方法的作用主要在于,如果一个列表框是允许多选的,那么上面的方法就不好用了,应该用此方法得到列表对象,再取得被选中的多个元素。
● int getStateChange()
取得选择的状态,是SELECTED还是DESELECTED
事件产生原因:各种按钮的点击,列表框的选择
-----------------------------------------------------------------
监听器:FocusListener
方 法:focusGained、focusLost
事 件:FocusEvent
● Component getOppositeComponent()
得到“参与焦点变换的”另一个对象。如果是焦点取得事件,则返回之前拥有焦点的对象;如果是焦点失去事件,则返回得到焦点的对象。若焦点转移到另外一个应用程序,返回null
● boolean isTemporary()
焦点是临时性转移还是永久转移。临时性转移:用鼠标拖动窗口或者窗口变为非激活状态。其他为永久性转移。
事件产生原因:各种组件的焦点变化
------------------------------------------------------------------
监听器:KeyListener
方 法:keyPressed、keyReleased、keyTyped
事 件:KeyEvent
● char getKeyChar()
此方法只在keytyped中有效,返回按下的字符。比如按下shift+a,返回'A'
● int getKeyCode()
取得键盘上按键的整数编码。请注意,是键盘上的按键,比如F1,Ctrl,Home键等等,都有相应编码。不支持组合键,也就是说“Shift+a”和“a”返回同样的内容,都是小写a的ASCII码。但是大键盘的数字键和小键盘的数字键返回内容不同。
● static String getKeyModifiersText(int modifiers)
将掩码转化为字符串,比如“Ctrl”,“Ctrl+Shift”等。注意它是static方法
● static String getKeyText(int keyCode)
返回keyCode代表的按钮的名字,比如"Home","F1"等。注意它是statci方法
事件产生原因:在各种组件上敲击键盘
----------------------------------------------------------------
监听器:MouseListener
方 法:mouseClicked、mousePressed、mouseReleased
mouseEntered、mouseExited
事 件:MouseEvent
● Point getLocationOnScreen()
返回鼠标相对于显示屏幕的绝对坐标(java 1.6版提供)
● int getXOnScreen()
返回鼠标相对于显示屏幕的X的绝对坐标(java 1.6版提供)
● int getYOnScreen()
返回鼠标相对于显示屏幕的Y的绝对坐标(java 1.6版提供)
● Point getPoint()
返回鼠标相对于组件的绝对坐标
● int getX()
返回鼠标相对于组件的X的绝对坐标
● int getY()
返回鼠标相对于组件的Y的绝对坐标
● void translatePoint(int x, int y)
给鼠标的做用点加上一个偏移量。比如2个参数分别是10, 20,你要用鼠标画直线,当你鼠标指向100,100开始画,实际上的线是画在110,120处
● int getClickCount()
产生此事件时鼠标共点击了多少下(单击、双击、三击……)
● int getButton()
产生此事件时,鼠标的哪个键被点击了:NOBUTTON, BUTTON1, BUTTON2 或者 BUTTON3
● boolean isPopupTrigger()
是否能够触发一个弹出式菜单。由于各平台触发弹出式菜单的情况不一样,因此应该在mousePressed 和 mouseReleased中都检测一下
事件产生原因:在任何组件上点击鼠标、将光标移动进来或出去
---------------------------------------------------------------------
监听器:MouseMotionListener
方 法:mouseDragged、mouseMoved
事 件:MouseEvent
同上!
事件产生原因:在任何组件上移动鼠标
---------------------------------------------------------------------
监听器:MouseWheelListener
方 法:mouseWheelMoved
事 件:MouseWheelEvent
● int getScrollType()
滚动的类型,是按块滚动WHEEL_BLOCK_SCROLL还是按单位滚动WHEEL_UNIT_SCROLL
● int getScrollAmount()
返回为相应此事件应该滚动的单位数。此方法有效的前提是按单位滚动。
● int getWheelRotation()
鼠标滚轮滚动过程中”咔嚓“声的数目。向上滚为负值,向下滚为正值
事件产生原因:在任何组件上滚动鼠标中键
--------------------------------------------------------------------
监听器:WindowListener
方 法:windowOpened、windowClosing、windowClosed、windowIconified
windowDeiconified、windowActivated、windowDeactivated
事 件:WindowEvent
● Window getWindow()
返回发生此事件的window对象
● Window getOppositeWindow()
若发生了焦点转移,返回另一个参与此事件的window对象,或者null
● int getOldState()
窗口变化前的状态:NORMAL、ICONIFIED、MAXIMIZED_BOTH
● int getNewState()
窗口变化后的状态
事件产生原因:窗口发生变化
----------------------------------------------------------------------
监听器:WindowFocusListener
方 法:windowGainedFocus、windowLostFocus
事 件:WindowEvent
同上!
事件产生原因:窗口得到或失去焦点
------------------------------------------------------------------------
监听器:WindowStateListener
方 法:WindowStateChanged
事 件:WindowEvent
同上!
事件产生原因:窗口状态改变
3、定时任务组件
javax.swing.Timer //在指定延迟之后激发一个或多个操作事件,实现定时功能。
void start() //启动该 Timer。
void stop() //停止该 Timer
java.util.Timer //配合TimerTask使用,实现定时功能。
schedule(TimerTask task, Date time) //安排在指定的时间执行指定的任务。
schedule(TimerTask task, long delay) //安排在指定延迟后执行指定的任务
1、平台无关性,无需依赖平台
容器:代表管理,可以添加组件
组件:代表功能
2、类层次结构
java.awt.Component
java.awt.Container
java.awt.Window
javax.swing.JWindow
java.awt.Frame——javax.swing.JFrame
java.awt.Dialog——javax.swing.JDialog
java.awt.Pane
java.awt.Applet——javax.swing.JApplet
javax.swing.JComponet——swing轻量级组件
3、swing组件分类
(1)顶层容器:
JFrame, JDialog, JApplet, JWindow
(2)普通容器:
JPanel, JScrollPane, JSplitPane,JTabbedPane,JOptionPane
(3)特殊容器:
JInternalFrame, JLayeredPane, JRootPane, JToolBar
(4)基本控件,实现人-机交互的组件:
JButton , JTextField, JLabel, JTextArea, JMenu, JSlider
JComboBox,JList ,JProgressBar, JToolTip
JColorChooser, JFileChooser, JTable, JTree
4、JFrame
(1)JFrame类的特性:
默认不可视;
默认宽高为0;
JFrame与JFrame不能相互嵌套
默认布局BorderLayout
(2)常用方法
JFrame();创建无标题窗口
JFrame(String s):创建一个有标题窗口
* get/setTitle(char s):获取/设置帧的标题,将s设置为窗口标题。
* get/setState():获取/设置帧的最小化、最大化等状态。
* is/setVisible(boolean b):获取/设置帧的可视状态
* get/setLocation(int a,int b):获取/设置帧在屏幕上应当出现的位置。 *get/setSize(int width,int height):获取/设置帧的大小。
*JFrame.setResizable(false/true):设置窗口的大小是否可被改变。
*setDefaultCloseOperation(int operation);设单击关闭图标后的响应,
operation可取下值 :
DO_NOTHING_ON_CLOSE 什么也不做
HIDE_ON_CLOSE 隐藏当前窗口
DISPOSE_ON_CLOSE 隐藏当前窗口,并彩旗窗体占有的其他资源
EXIT_ON_CLOSE 结束窗体所在应用程序
* add():将组件添加到帧中。
5、JDialog
(1)特性
必须依赖一个JFrame对象
常用构造方法: JDialog(JFrame f,String s);
JDialog具有和JFrame一样的特性;
JDialog分两种: 有模,无模;
(2)常用方法
setSize(200,200); //设置对话框窗口大小
setLocation(300,300); //设置对话框窗口位置
setVisible(true); //设置对话框窗口是否为可见
setModal(false); //设置对话框窗口模式
setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE)
6、JPanel
JPanel是JComponet的子类,因此JPanel是轻量级组件, 且JPanel可以容纳其它组件;我们称JPanel为中间容器;
(1)JPanel容器特性:
需加入JFrame才可见
默认可见;
默认布局: FlowLayout;
JPanel与JPanel可相互嵌套;
7、JScrollPane
产生滚动条
JTextArea txaDisplay = new JTextArea(); JScrollPane scroll = new JScrollPane(txaDisplay); //分别设置水平和垂直滚动条自动出现 scroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //分别设置水平和垂直滚动条总是出现 scroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); //分别设置水平和垂直滚动条总是隐藏scroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_NEVER);
8、JSplitPane
Split Pane(分割面版)一次可将两个组件同时显示在两个显示区中,若你想要同时在多个显示区显示组件,你便必须同时使用多个Split Pane。JSplitPane提供两个常数让你设置到底是要水平分割还是垂直分割。这两个常数分别是:HORIZONTAL_SPIT,VERTICAL_SPLIT.
例子:
public class JSplitPane1{ public JSplitPane1(){ JFrame f=new JFrame("JSplitPaneDemo"); Container contentPane=f.getContentPane(); JLabel label1=new JLabel("Label 1",JLabel.CENTER); label1.setBackground(Color.green); label1.setOpaque(true);//setOpaque(ture)方法的目的是让组件变成不透明,这样我们在JLabel上所设置的颜色显示出来。 JLabel label2=new JLabel("Label 2",JLabel.CENTER); label2.setBackground(Color.pink); label2.setOpaque(true); JLabel label3=new JLabel("Label 3",JLabel.CENTER); label3.setBackground(Color.yellow); label3.setOpaque(true); /*加入label1,label2到splitPane1中,并设置此splitPane1为水平分割且具有Continuous Layout的 *功能。 */ JSplitPane splitPane1=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,false,label1,label2); /*设置splitPane1的分隔线位置,0.3是相对于splitPane1的大小而定,因此这个值的范围在0.0~1.0 *中。若你使用整数值来设置splitPane的分隔线位置,如第34行所示,则所定义的值以pixel为计算单位 */ splitPane1.setDividerLocation(0.3); splitPane1.setResizeWeight(0.3); /*设置JSplitPane是否可以展开或收起(如同文件总管一般),设为true表示打开此功能。 */ splitPane1.setOneTouchExpandable(true); splitPane1.setDividerSize(10);//设置分隔线宽度的大小,以pixel为计算单位。 JSplitPane splitPane2=new JSplitPane(JSplitPane.VERTICAL_SPLIT,false,splitPane1,label3); splitPane2.setDividerLocation(35); //设置JSplitPane是否可以展开或收起(如同文件总管一般),设为true表示打开此功能. splitPane2.setOneTouchExpandable(false); splitPane2.setDividerSize(5); contentPane.add(splitPane2); f.setSize(250,200); f.show(); f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); } public static void main(String[] args){ new JSplitPane1(); } }
9、JTabbedPane 面板切换工具、标题面板
10、基本控件
(1)JButton生成按钮;常用方法:
public JButton(); public JButton(String tag);
public void setText(String tag);
public String getText();
(2)JTextField生成单行文本框;常用方法:
public JTextField();public JTextField(int cols);
public void setText(String tag);
public String getText();
(3)JLabel生成标签;常用方法:
public JLabel(); public JLabel(String tag);
public void setText(String tag);
public String getText();
(4)JPasswordField生成密码框;常用方法:
public JPasswordField(); public JPasswordField (int cols);
public void setText(String default);
public char[ ] getPassword();
public setEchoChar(char c)
(5)JTextArea生成多行文本框;常用方法:
public JTextArea(); public JTextArea(int rows, int cols)
public JTextArea(String text, int rows, int cols) ;
public void setText(String str);
public String getText();
public void append(String str);
11、通用方法
setIcon(Icon icon); //设置其上显示的图标.
setBackground(Color c); //设置背景色.
setForeground(Color c); //设置其上文字颜色.
setFont(Font font); //设置字体.
setPreferredSize(Dimension ds); //设置大小.
setBorder(Border bd); //设置边框.
setEnable(boolean b); //是否可用.
setEditable(boolean b); //是否可编辑
相关类如下:
Icon / ImageIcon //图标相关类
Icon icon1=new ImageIcon(“图片路径”);
Color //颜色相关类
Color color1=new Color(255,0,0); //红色
Font //字体相关类
Font font1=new Font(“隶书”, Font.BOLD,16);
Dimension //大小相关类
Dimension dim1=new Dimension(宽,高);
Border / BorderFactory //边框相关类
createTitledBorder(String title); //有标题边框
createBevelBorder(int type); //斜面边框
createLineBorder(Color color); //颜色边框
createEmptyBorder(int top, int left, int bottom, int right); // 空边框,用于产生边距
createCompoundBorder(Border out, Border in); //组合边框,将两个边框效果组合
12、JOptionPane模式对话框
ConfirmDialog --- 确认对话框,提出问题,然后由用户自己来确(按"Yes"或"No"按钮)
InputDialog --- 提示输入文本
MessageDialog --- 显示信息
OptionDialog -- 组合其它三个对话框类型。
这四个对话框可以采用showXXXDialog()来显示,如showConfirmDialog()显示确认对话框、showInputDialog()显示输入文本对话框、showMessageDialog()显示信息对话框、showOptionDialog()显示选择性的对话框。它们所使用的参数说明如下:
① ParentComponent:指示对话框的父窗口对象,一般为当前窗口。也可以为null即采用缺省的Frame作为父窗口,此时对话框将设置在屏幕的正中。
② message:指示要在对话框内显示的描述性的文字
③ String title:标题条文字串。
④ Component:在对话框内要显示的组件(如按钮)
⑤ Icon:在对话框内要显示的图标
⑥ messageType:一般可以为如下的值ERROR_MESSAGE、INFORMATION_MESSAGE、WARNING_MESSAGE、QUESTION_MESSAGE、PLAIN_MESSAGE、
⑦ optionType:它决定在对话框的底部所要显示的按钮选项。一般可以为DEFAULT_OPTION、YES_NO_OPTION、YES_NO_CANCEL_OPTION、OK_CANCEL_OPTION。
使用实例:
(1) 显示MessageDialog
JOptionPane.showMessageDialog(null, "在对话框内显示的描述性的文字", "标题条文字串", JOptionPane.ERROR_MESSAGE);
(2) 显示ConfirmDialog
JOptionPane.showConfirmDialog(null, "choose one", "choose one", JOptionPane.YES_NO_OPTION);
(3) 显示OptionDialog:该种对话框可以由用户自己来设置各个按钮的个数并返回用户点击各个按钮的序号(从0开始计数)
Object[] options = {"确定","取消","帮助"}; int response=JOptionPane.showOptionDialog(this, "这是个选项对话框,用户可以选择自己的按钮的个数" , "选项对话框标题",JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if(response==0) { this.setTitle("您按下了第OK按钮 "); } else if(response==1) { this.setTitle("您按下了第Cancel按钮 "); } else if(response==2) { this.setTitle("您按下了第Help按钮 "); }
(4) 显示InputDialog 以便让用户进行输入
String inputValue = JOptionPane.showInputDialog("Please input a value");
(5) 显示InputDialog 以便让用户进行选择地输入
Object[] possibleValues = { "First", "Second", "Third" }; //用户的选择项目 Object selectedValue = JOptionPane.showInputDialog(null, "Choose one", "Input",JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); setTitle("您按下了"+(String)selectedValue+"项目");
二、布局管理器
---布局管理器(LayoutManager):每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。
---布局管理器种类:
FlowLayout: 组件在一行中从左至右水平排列,排满后折行,它是Panel、Applet的默认布局管理器。
BorderLayout:北、南、东、西、中,它是Window、Frame、Dialog的默认布局管理器。
GridLayout:以行和列的网格形式安排组件
GridBagLayout:更复杂、功能更强的网格布局
CardLayout:每一个组件作为一个卡片,容器仅显示多个卡片中的某一个确定容器布局
布局管理器
当一个窗口中的组件较多时,界面应该简洁整齐,布局合理。Java采用布局管理器对容器中的组件进行相对布局,当改变容器大小时,或者改变组件的大小,或者改变组件之间的相对位置,保证组件不会被覆盖并且容器没有空白区域。
Java提供多种风格和特点的布局管理器,每一种布局管理器指定一种组件之间的相对位置。Java.awt中的布局管理器类主要有:FlowLayout、BorderLayout和GridLayout。
布局是容器类的特性,每种容器都有一中默认布局。Window窗口类的默认布局管理器是BorderLayout,Panel面板类的默认布局是FlowLayout。如果一个容器需要改变其默认布局管理器,可以调用Container容器类的FlowLayout()方法。
1、 FlowLayout流布局管理器
FlowLayout布局管理器提供按行布置组件方式,将组件按从左到右顺序、一行一行地排列,当一行放满时再放置下一行。组件保持自己的尺寸,容器中一行的宽度随容器的宽度而变化。当改变容器大小时,组件的相对位置随容器大小而变化,将呈现一行或多行。
FlowLayout类的部分声明如下:
public class FlowLayout implements LayoutManager.jaca.io.Serializable{
public static final int LEFT=0; //左对齐
public static final int CENTER=1; // 居中
public static final int RIGHT=2; //右对齐
public FlowLayout() //构造方法,默认居中
public FlowLayout(int align) //align参数指定对齐方式
public FlowLayout(int align,int hgap,int vgap) //hgap、vgap指定组件间的水平和垂直间距
}
2、 BorderLayout边界布局管理器
BorderLayout布局管理器将容器划分为五个区域,东、南、西、北四条边和中间,组件占满一条边或中间部分。当改变容器大小时,四边组件的长度或宽度不变,中间组件的长度和宽度随着容器大小而变化。
BorderLayout类的部分声明如下:
public class BorderLayout implements LayoutManager2,java.io.Serializable{
public static final String NORTH="North";
public static final String SOUTH="South";
public static final String EAST="East";
public static final String WEST="West";
public static final String CENTER="Center";
public BorderLayout() //构造方法,组件之间的间距为0像素
public BorderLayout(int hgap,int vgap) //参数指定组件之间的水平和垂直间距(像素)
}
Container类为BorderLayout布局提供以下添加组件的方法:
public void add(Component comp,Object constraints)
其中,constrains参数指定组件添加到BorderLayout布局容器的位置,取值为BordetLayout类的常量,如BorderLayout.EAST或“South”。例如,下列语句将5个按钮一次放置在框架的5个区域中:
Frame frame =new Frame();
frame.add(new Button("东"),BorderLayout.EAST);
frame.add(new Button("南"),"South");
frame.add(new Button("西"),"West");
frame.add(new Button("北"),"North");
frame.add(new Button("中"),BorderLayout.CENTER); //可以省略为this.add(new Button("中"));
当constraints参数取值为BorderLayout.CENTER时,参数可以省略。如果将多个组件放置在同一个区域,则后放置组件将覆盖先放置的组件。
3、 GridLayout网格布局管理器
GridLayout布局管理器将容器划分为大小相等的若干行乘若干列的网格,组件从左至右,从上至下一次放入网格中。组件大小随容器大小而变化。如果组件数多于网格数,Java将自动增加网格;反之,一些网格将空置。
GridLayout类的部分声明如下:
public class GridLayout implements LayoutManager,java.io.Serializable{
public GridLayout()
public GridLayout(int rows,int cols)
public GridLayout(int rows,int cols,int hgap,int vgap)
}
GridLayout布局的组件放置次序是行优先,从第一行开始,从左至右依次放置,一行放满后自动转入下一行。如果组件数超过网格数,则布局管理器会自动增加网格数,增加的原则是保持行数不变。如果需要在指定位置放置组件,则可调用Container类为GridLayout布局提供以下方法:
public Component add(Component comp,int index)
例如:
Frame frame=new Frame();
frame.setLayout(new GridLayout(3,2)); //设置3行2列的网格布局
frame.add(new Button("botton1")); //依次添加组件
frame.add(new Button("botton2"),0); //将组件插入在指定位置
4、BoxLayout盒式布局
用BoxLayout类可以创建一个布局对象,称为盒式布局。BoxLayout在javax.swing.border包中。javax.swing包提供了Box类,该类创建的容器称作一个盒子式容器,盒式容器的默认布局就是盒式布局,而且不允许更改盒式容器的布局,使用盒子式布局的容器针组件排列在一行或一列;
常用方法:
//创建一个从左到右显示其组件的 Box。
public static Box createHorizontalBox()
//创建一个不可见的、固定宽度的组件。
public static Component createHorizontalStrut(int width)
//创建一个横向 glue 组件
public static Component createHorizontalGlue()
//创建一个从上到下显示其组件的 Box。
public static Box createVerticalBox()
//创建一个不可见的、固定高度的组件。
public static Component createVerticalStrut(int height)
//创建一个纵向 glue 组件。
public static Component createVerticalGlue()
//创建一个总是具有指定大小的不可见组件。
public static Component createRigidArea(Dimension d)
三、菜单相关类
JMenuBar //菜单条
JMenu //菜单
addSeparator(); //为菜单加分隔线
JMenuItem //菜单项
ButtonGroup/JRadioButtonMenuItem //单选框菜单
JFrame有setJMenuBar(JMenuBar mb)方法为窗体设置菜单.
菜单(JMenu)和菜单项(JMenuItem)都扩展了AbstractButton类。菜单和菜单项包含与许多Swing按钮相同的特性。比如,菜单项可以在鼠标经过时,高亮显示;可以被单击,表明用户做出了选择;可以像按钮一样被禁止使用。
复选菜单项(JCheckBoxMenuItem)与单选菜单项(JRadioButtonMenuItem)扩展了JMenuItem,其也具有与许多 Swing按钮相同的特性,如可以在选中与非选中状态之间进行切换。
JMenu扩展了JMenuItem类,每个JMenu对象都包含一个用做菜单标题的隐藏菜单项。菜单不一定出现在菜单栏上,其可以被嵌入其他的菜单中充当子菜单。菜单栏包含一个或多个菜单,其使用与平台相关的位置摆放,通常位于窗口的上方。
弹出式菜单(JPopupMenu)只有在用户执行了与平台相关的鼠标操作后才能出现。例如,在一个支持弹出式菜单的控件上用鼠标右键单击,在鼠标所在处将弹出快捷菜单。
例子:
public class DemoSimpleMenu extends JFrame{ JMenuBar jMenuBarOne; JMenu fileMenu,editMenu,newFileMenu; JMenuItem openFile,closeFile;//声明菜单 JCheckBoxMenuItem newFileTxt,newFileJava; JRadioButtonMenuItem copyFile,pasteFile; ButtonGroup buttonEdit; public DemoSimpleMenu(){ jMenuBarOne=new JMenuBar(); buttonEdit=new ButtonGroup(); /* *创建几个JMenu对象 */ fileMenu=new JMenu("文件"); editMenu=new JMenu("编辑"); newFileMenu =new JMenu("新建文件"); openFile=new JMenuItem("打开文件"); closeFile=new JMenuItem("关闭文件"); /* *创建两个JCheckBoxMenuItem对象 */ newFileTxt=new JCheckBoxMenuItem("文本文件"); newFileJava=new JCheckBoxMenuItem("Java文件"); /* *创建两个JRadioButtonMenuItem对象 */ copyFile=new JRadioButtonMenuItem("复制"); pasteFile=new JRadioButtonMenuItem("粘贴"); buttonEdit.add(copyFile); buttonEdit.add(pasteFile); this.setJMenuBar(jMenuBarOne); jMenuBarOne.add(fileMenu); jMenuBarOne.add(editMenu); /* *向fileMenu中添加JMenuItem对象 */ fileMenu.add(openFile); fileMenu.add(closeFile); fileMenu.addSeparator(); fileMenu.add(newFileMenu); newFileMenu.add(newFileTxt); newFileMenu.add(newFileJava); editMenu.add(copyFile); editMenu.add(pasteFile); /* *设置窗体的大小、位置、可见性以及按下关闭按钮时的默认动作 */ this.setTitle("菜单的简单使用"); this.setBounds(100,100,250,150); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String args[]){ new DemoSimpleMenu(); } }
四、皮肤设置
设置快捷键
setMnemonic( KeyEvent.VK_A )
设置皮肤(自己扩展)
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
// com.sun.java.swing.plaf.motif.MotifLookAndFeel
//com.sun.java.swing.plaf.windows.WindowsLookAndFeel
// javax.swing.plaf.metal.MetalLookAndFeel
} catch (Exception e) {
e.printStackTrace();
}
五、事件处理
1、事件处理涉及的三大对象
Event-事件,用户对界面操作在java语言上的描述,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。
Event Source-事件源,事件发生的场所,通常就是各个组件,例如按钮JButton。
Event handler-事件处理者,接收事件对象并对其进行处理的
2、监听器
监听器:ActionListener
方 法:actionPerformed
事 件:ActionEvent
● String getActionCommand()
actioncommand是控件内部的一个字符串,用于标识控件的状态。
此函数可以取得控件的状态,从而决定到底该做什么。
● int getModifiers()
取得“产生此事件时,用户同时按下的组合键”
● long getWhen()
取得“产生此事件时的时间戳”
事件产生原因:点击按钮,在列表框中选择内容,在文本框中点回车,计时器到期
------------------------------------------------------------------
监听器:AdjustmentListener
方 法:adjustmentValueChanged
事 件:AdjustmentEvent
● Adjustable getAdjustable()
adjustable是一个接口,各种滚动条都实现了这个接口。
● int getAdjustmentType()
取得滚动类型,共有UNIT_INCREMENT,UNIT_DECREMENT,BLOCK_INCREMENT,BLOCK_DECREMENT,TRACK共5种类型
● int getValue()
取得滚动滑块的当前值
事件产生原因:滚动条的滚动
------------------------------------------------------------------
监听器:ItemListener
方 法:itemStateChanged
事 件:ItemEvent
● Objedt getItem()
取得被选中的元素。注意,返回值是Object,还应该进行强制类型转换。
● ItemSelectable getItemSelectable()
ItemSelectable是一个接口,代表那些包含了n个可供选择的子元素的对象。此方法返回产生此事件的对象。此方法的作用主要在于,如果一个列表框是允许多选的,那么上面的方法就不好用了,应该用此方法得到列表对象,再取得被选中的多个元素。
● int getStateChange()
取得选择的状态,是SELECTED还是DESELECTED
事件产生原因:各种按钮的点击,列表框的选择
-----------------------------------------------------------------
监听器:FocusListener
方 法:focusGained、focusLost
事 件:FocusEvent
● Component getOppositeComponent()
得到“参与焦点变换的”另一个对象。如果是焦点取得事件,则返回之前拥有焦点的对象;如果是焦点失去事件,则返回得到焦点的对象。若焦点转移到另外一个应用程序,返回null
● boolean isTemporary()
焦点是临时性转移还是永久转移。临时性转移:用鼠标拖动窗口或者窗口变为非激活状态。其他为永久性转移。
事件产生原因:各种组件的焦点变化
------------------------------------------------------------------
监听器:KeyListener
方 法:keyPressed、keyReleased、keyTyped
事 件:KeyEvent
● char getKeyChar()
此方法只在keytyped中有效,返回按下的字符。比如按下shift+a,返回'A'
● int getKeyCode()
取得键盘上按键的整数编码。请注意,是键盘上的按键,比如F1,Ctrl,Home键等等,都有相应编码。不支持组合键,也就是说“Shift+a”和“a”返回同样的内容,都是小写a的ASCII码。但是大键盘的数字键和小键盘的数字键返回内容不同。
● static String getKeyModifiersText(int modifiers)
将掩码转化为字符串,比如“Ctrl”,“Ctrl+Shift”等。注意它是static方法
● static String getKeyText(int keyCode)
返回keyCode代表的按钮的名字,比如"Home","F1"等。注意它是statci方法
事件产生原因:在各种组件上敲击键盘
----------------------------------------------------------------
监听器:MouseListener
方 法:mouseClicked、mousePressed、mouseReleased
mouseEntered、mouseExited
事 件:MouseEvent
● Point getLocationOnScreen()
返回鼠标相对于显示屏幕的绝对坐标(java 1.6版提供)
● int getXOnScreen()
返回鼠标相对于显示屏幕的X的绝对坐标(java 1.6版提供)
● int getYOnScreen()
返回鼠标相对于显示屏幕的Y的绝对坐标(java 1.6版提供)
● Point getPoint()
返回鼠标相对于组件的绝对坐标
● int getX()
返回鼠标相对于组件的X的绝对坐标
● int getY()
返回鼠标相对于组件的Y的绝对坐标
● void translatePoint(int x, int y)
给鼠标的做用点加上一个偏移量。比如2个参数分别是10, 20,你要用鼠标画直线,当你鼠标指向100,100开始画,实际上的线是画在110,120处
● int getClickCount()
产生此事件时鼠标共点击了多少下(单击、双击、三击……)
● int getButton()
产生此事件时,鼠标的哪个键被点击了:NOBUTTON, BUTTON1, BUTTON2 或者 BUTTON3
● boolean isPopupTrigger()
是否能够触发一个弹出式菜单。由于各平台触发弹出式菜单的情况不一样,因此应该在mousePressed 和 mouseReleased中都检测一下
事件产生原因:在任何组件上点击鼠标、将光标移动进来或出去
---------------------------------------------------------------------
监听器:MouseMotionListener
方 法:mouseDragged、mouseMoved
事 件:MouseEvent
同上!
事件产生原因:在任何组件上移动鼠标
---------------------------------------------------------------------
监听器:MouseWheelListener
方 法:mouseWheelMoved
事 件:MouseWheelEvent
● int getScrollType()
滚动的类型,是按块滚动WHEEL_BLOCK_SCROLL还是按单位滚动WHEEL_UNIT_SCROLL
● int getScrollAmount()
返回为相应此事件应该滚动的单位数。此方法有效的前提是按单位滚动。
● int getWheelRotation()
鼠标滚轮滚动过程中”咔嚓“声的数目。向上滚为负值,向下滚为正值
事件产生原因:在任何组件上滚动鼠标中键
--------------------------------------------------------------------
监听器:WindowListener
方 法:windowOpened、windowClosing、windowClosed、windowIconified
windowDeiconified、windowActivated、windowDeactivated
事 件:WindowEvent
● Window getWindow()
返回发生此事件的window对象
● Window getOppositeWindow()
若发生了焦点转移,返回另一个参与此事件的window对象,或者null
● int getOldState()
窗口变化前的状态:NORMAL、ICONIFIED、MAXIMIZED_BOTH
● int getNewState()
窗口变化后的状态
事件产生原因:窗口发生变化
----------------------------------------------------------------------
监听器:WindowFocusListener
方 法:windowGainedFocus、windowLostFocus
事 件:WindowEvent
同上!
事件产生原因:窗口得到或失去焦点
------------------------------------------------------------------------
监听器:WindowStateListener
方 法:WindowStateChanged
事 件:WindowEvent
同上!
事件产生原因:窗口状态改变
3、定时任务组件
javax.swing.Timer //在指定延迟之后激发一个或多个操作事件,实现定时功能。
void start() //启动该 Timer。
void stop() //停止该 Timer
java.util.Timer //配合TimerTask使用,实现定时功能。
schedule(TimerTask task, Date time) //安排在指定的时间执行指定的任务。
schedule(TimerTask task, long delay) //安排在指定延迟后执行指定的任务