第五章一些基本类
一、Math类(数学类)
1,字段:E:对数。
PI:3.1415926
2,方法全都是静态方法
1)abs:绝对值
2)ceil:返回大于或等于参数的最小整数值;
3) exp:计算以参数为指数的幂
4)floor:返回小于或等于参数的最大整数;
5)IEEEremainder:计算参数1除以参数2后的余数;
6)log:自然对数。
7)max 最大值。
8)min 最小值。
9)pow:计算以参数1为底参数2为指数的幂。
10)sqrt:平方根
11)rint:求最接近参数的整数值。(0.5舍,大于0.5入)
12)round:求最接近参数的整数值(标准的四舍五入)
13)random:返回随机数(0~1之间)。
二、System类
1、arraycopy(object src, //源数据->数组
int srcPos, //从哪开始读
object dest, //数据目的->数组
int destPos, //从哪开始写
int length ) //写的长度
2、取得当前系统环境的信息
properties pro=system.getProperties();
3、取得系统信息
System.getProperty("https://www.doczj.com/doc/d918909225.html,")
System.setProperty("https://www.doczj.com/doc/d918909225.html,","Windows XP")//修改
4、exit(int status)//如参数为零,可关闭Frame。
5、currentTimeMillis();//获得系统当前时间,从1970年1月1日0点到现在的毫秒数。
三、重讲String类
四、Date类
五、Calendar类、GregorianCalendar类、Object类、Class类、ArrayList类、GregorianCalendar类、Object类、Class类、ArrayList类
六、基本类型所对应的类和NumberFormat类、BigInteger类、BigDecimal类、Random类、
Arrays类
第六章图形用户界面(GUI)之图形编程
一、简介
GUI(Graphical User Interface),即图形用户界面。就是应用程序提供给用户操作的图形界面,包括窗口、菜单、按钮、工具栏和其他各种屏幕元素。在Java里有两个包为GUI 设计提供丰富的功能,它们是AWT(Abstract Window Toolkit,抽象窗口工具箱)和Swing。
AWT是Java的早期版本,其中的AWT组件各类有限,可以提供基本的GUI设计工具,却无法完全实现目前GUI设计所需的所有功能。
Swing是SUN公司对早期版本的改进版本,它不仅包括AWT中具有的所有部件,并且提供了更加丰富的部件和功能,它足以完全GUI设计所需的一切功能。
AWT是Swing的基础。Swing的产生主要原因就是AWT不能满足图形化用户界面发展的需要。
AWT设计的初衷是支持开发小应用程序的简单用户界面。例如AWT缺少剪贴板、打印支持、键盘导航等特性,而且原来的AWT甚至不包括弹出式菜单或滚动窗格等基本元素。此外AWT还存在着严重的缺陷,人们使AWT适应基于继承的、具有很大伸缩性的事件模型,基于同位体的体系结构也成为其致命的弱点。随着发展的需要,Swing出现了,Swing组件几乎都是轻量组件,与重量组件相比,没有本地的对等组件,不像重量组件要在它们自己的本地不透明窗体中绘制,轻量组件在它们的重量组件的窗口中绘制。
Swing是由100%纯Java实现的,Swing组件是用Java实现的轻量级( light-weight)组件,没有本地代码,不依赖操作系统的支持,这是它与AWT组件的最大区别。由于AWT组件通过与具体平台相关的对等类(Peer)实现,因此Swing比AWT组件具有更强的实用性。Swing在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。Swing采用了一种MVC的设计模式,即"模型-视图-控制器"(Model-View-Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。Swing 外观感觉采用可插入的外观感觉(Pluggable Look and Feel,PL&F)。在AWT组件中,由于控制组件外观的对等类与具体平台相关,使得AWT组件总是只有与本机相关的外观。Swing使得程序在一个平台上运行时能够有不同的外观。用户可以选择自己习惯的外观。
二、窗口(JFrame)
Java中的顶层窗口(即那些没有包含在其他窗口中的窗口)被称作框架。AWT库中有一个对应着顶层的称作Frame的类。这个类的Swing版本被叫作Jframe;它从Frame类扩展而来,Jframe是少数几个不绘制在画布上的Swing组件之一。因此,它的修饰部件(按钮、标题栏、图标等等)是通过用户的窗口系统,而非Swing绘制的。框架是一种容器。这意味着一个框架可以容纳按钮、文本域等其他用户界面组件。
导包
java.awt.*; 底层类
java.awt.event; 事件
javax.swing.*; 图形组件
一个简单例子
import javax.swing.*;
public class SimpleFrameTest {
public static void main(String[] args) {
SimpleFrame frame = new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame.setUndecorated(true);
frame.show();
// frame.setVisible(true);
frame.setLocation(100,100);
frame.setBounds(10,10,1000,500);
}
}
class SimpleFrame extends JFrame{
public SimpleFrame(){
setSize(this.DEFAULT_WIDTH,this.DEFAULT_HEIGHT);
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}
创建一个最简单的窗口
1、导包
1,窗口对象(JFrame frame=new JFrame)
2,设置大小 (frame.setSize(300,300))
3,关闭(frame.setDefaultCloseOperation(3))//3即是Jframe.EXIT_ON_CLOSE的常量值。
4,显示 (frame.setVisible(true)),或者用show()方法。
注意:Jframe类继承了超类Window中的show方法。而Window类的一个超类Component 也有show方法。Component.show方法已经不提倡使用,如果想显示一个组件,应该转而使用setVisible(true)。不过,Window.show方法并没有不鼓励使用。对于窗口和框架来说,调用show而非setVisible才有意义,这是因为show使窗口可见并把窗口放到前头。
JFrame有四层:
第一层:GlassPane (透明层)
第二层:ContentPane(内容层)还有menubar(菜单条),由this.getContentPane()来得到该对象
第三层:LayeredPane(布局层)
第四层:RootPane(根层)->this.setBackgroud
Toolkit(工具箱):当我们调用一个方法来检查屏幕的分辨率时,需要一个能同底层操
作系统打交道的方法,因为屏幕分辨率等信息只能由操作系统来提供。
GetDefaultToolkit//得到Toolkit类的一个实例,即对象。
GetScreenSize//得到屏幕尺寸,返回Dimension的对象。
控制窗体显示位置:
JFrame frame=new JFrame();
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension screenSize=m.getScreenSize();
frame.pack();//用紧凑方式显示窗口
frame.setLayout();//改变布局
int x= screenSize.height/4; //求得窗口左上角的横坐标
int y= screenSize.width/4; //求得窗口左上角的纵坐标
frame.setLocation(x,y);//窗口要显示的位置,即窗口左上角的位置开始显示
frame.setSize(screenSize.width/2,screenSize.height/2);//窗口的大小。
(frame.getContentPane()).setBackground(Color.red);显示背景色可以通过调用frame.setUndecorated(true)关闭对框架的修饰。
可用下列代码代替setDefaultCloseOperation方法的调用(而且Frame中无该方法),如:
frame.addWindowListener(
new WindowAdapter(){
public void windowClosing(windowEvent e){
System.exit(0);
}
});
设置图标
Image img = kit.getImage("icon.gif");
frame.setIconImage(img);
其他方法:
/*
dispose方法:关闭窗口并收回用于创建窗口的任何系统资源。
*/
SetIconImage方法:当窗口最小化(在Java中常常称作图标化)时,把一个Image对象用作图标。
setTitle方法:改变标题栏中的文字。
SetResizable方法:使用boolean参数来决定框架大小是否能被用户改变。
SetLocation方法:重定位一个组件(Component类中的方法)。
SetBounds方法:允许在一次操作中重定一个组件的大小和位置。
SetExtendedState(Frame.MAXIMIZED_BOTH);//设置框架为最大化。
IsVisible();//检查组件是否可见。组件初始为可见的,但顶层组件,如Jframe除外。
IsShowing();//检查该组件是否正显示在屏幕上。若是,它必须是可见的并且显示在一
个正在显示的容器内。
IsEnabled();//检查组件是否被激活。被激活的组件能够接受键盘输入。组件初始为被激活。
SetEnabled();//激活或者禁用一个组件。
GetLocation();//返回该组件左上角的坐标值,该值是相对于包围容器的左上角而言。
GetLocationOnScreen();//返回该组件的左上角的坐标值,该值使用屏幕坐标。
GetSize();//得到组件的当前大小。
SetResizable();//决定用户是否可以缩放框架。
SetDefaultCloseOperation(Jdialog.DO_NOTHING_ON_CLOSE);//禁止使用窗口右上角的关闭按钮。
注意:对于框架,setLocation和setBounds中的坐标均是相对于整个屏幕的。屏幕左上角的坐标为0,0。
JFrame类的特性:
1、该类或其子类创建的窗体是swing窗体。
2、不能把组件直接添加到swing窗体中,swing窗体含有一个“内容面板”
的容器,应加到“内容面板”中。
3、不能为swing窗体设置布局,应为“内容面板”设置布局,默认为
BorderLayout布局。
4、swing窗体通过调用getContentPane()方法,得到它的“内容面板”。
三、面板(JPanel)
面板的特点:
1、一个能够在上面进行绘制的表面(如,字体等)。
2、身也是容器(可以容纳按钮、文本域等)。
把一个普通的Jpanel添加到内容面板是没有什么意义的――它什么也不能做。要使它变得有意义,必须(可以不是必须,如添加用户界面元素)使用继承来创建一个新类,然后通过覆盖或者添加方法的手段来获得所需的额外功能。
为了能在面板中进行绘制,需要:
1、定义一个扩展JPanel的新类。
2、覆盖paintComponent方法。
Jcomponent类是所有非窗口Swing组件的父类。PaintComponent方法有一个Graphics 类型的参数。Graphics对象存储了一个用于绘制图形和文本的设置集合(比如字体和当前颜色)。Java中的所有绘制都必须使用Graphics对象。它拥有绘制图案、图像和文本的方法。只要窗口需要重绘,不管是因为什么原因,事件处理器都会通知组件。它会引起所有组件中的paintComponent方法被执行。绝不要自己调用paintComponent。只要你的应用程序需要重新绘制,该方法就会自动调用。
触发这个自动过程的情况:
1、用户缩放窗口或者最小化然后还原窗口会引起重绘。
2、如果用户弹出一个窗口并且盖住了已有的窗口,然后消除覆盖的窗口,那么被覆盖的应用窗口已经被毁坏了,这时候就需要重新绘制。
3、当窗口首次显示时,它也需要处理那些指定如何绘制、在哪里绘制初始元素的代码。
注意:如果需要强制性重绘屏幕,那么可以调用repaint方法代替paintComponent。
这个方法会使用正确配置了的Graphics参数引起对所有组件的paintComponent调用。
例子:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class NotHelloWorldPanel extends JPanel
{ public void paintComponent(Graphics g)
{ super.paintComponent(g);
g.drawString("Not a Hello, World program", 75, 100);
}
}
class NotHelloWorldFrame extends JFrame
{ public NotHelloWorldFrame()
{ setTitle("NotHelloWorld");
setSize(300, 200);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
} );
Container contentPane = getContentPane();
contentPane.add(new NotHelloWorldPanel());
}
}
public class NotHelloWorld
{ public static void main(String[] args)
{ JFrame frame = new NotHelloWorldFrame();
frame.show();
}
}
用到的一些类:
getContentPane();//返回JFrame的内容面板对象
repaint();//“尽可能快地”重新绘制组件。
repaint(int x,int y,int width,int height);//“尽可能快地”重新绘制组件的一部分。
paintComponent(Graphics g);//需要覆盖该方法来说明组件应如何绘制。
使用Graphics来画线、矩形、椭圆,与后面讲到的2D图形进行比较。
线:直线:drawLine(x,y,x,y)//需要指定两点坐标。
折线:drawPolyLine(x点数组,y点数组,一共几个点)
矩形:drawRect(左上角(2个点),宽,高)
圆形:drawOval(左上角(2个点),宽,高)
多边形:drawPolygon(x点数组,y点数组,共几个点)
弧形:drawArc(左上角,宽,高,开始角度,画多少角度)
字符串:drawString("字符",左上角的坐标)
四、2D
J2SE包含了一个Java2D库,该库实现了一个非常强大的图形操作集合。若要在Java2D 库中绘制图形,首先需要得到一个Graphics2D类的对象。这个类是Graphics类的子类。只需在paintComponent方法中做一个类型转换:Graphics2D g2 = (Graphics2D)g;。Java2D 库使用面向对象的方式来组织几何形状。特别是,分别有不同的类来表示直线(Line2D)、矩形(Rectangle2D)和椭圆(Ellipse2D),这些类都实现Shape接口。为了绘制形状,你首先需要创建一个实现了Shape接口的类的对象,然后调用Graphics2D类的draw方法。类Rectangle2D和Ellipse2D都从超类RectangularShape继承而来。椭圆不是矩形,但它们有着矩形边界。RectangularShape类定义了20个以上对这些形状通用的方法,其中一些非常有用,如getWidth、getHeight、getCenterX以及getCenterY等。
每个图形所需要的条件
线(Line2D):
矩形(Rectangle2D):setRect(左上角(1个点,x坐标和y坐标),宽,高)// 如果不能确定左上角的位置,但可以得到矩形的两个对角,可以做如下操作:Rectangle2D rect = new Rectangle2D.Double();
Rect.setFrameFromDiagonal(px,py,gx,gy);
或者得到对角线的两个顶点的Point2D对象p和g,那么可以调用:
rect.setFrameFromDiagonal(p,g);
椭圆形(Ellipse2D)://这些代表边界矩形
当构造一个椭圆时,通常知道的是椭圆的中心、宽度、高度,而非边界矩形的顶点值。有一个setFrameFromCenter方法使用中心点,但它还需要四个顶点中的
一个。如:
Ellipse2D ellipse = new Ellipse2D.Double(centerX –width/2,centerY – height / 2,width,height);
例子:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class DrawTest {
public static void main(String[] args) {
DrawFrame frame = new DrawFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
class DrawFrame extends JFrame{
public DrawFrame(){
setTitle("DrawTest");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
DrawPanel panel = new DrawPanel();
Container contentPane = getContentPane();
contentPane.add(panel);
}
public static final int DEFAULT_WIDTH = 400;
public static final int DEFAULT_HEIGHT = 400;
}
class DrawPanel extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
double leftX = 100;
double topY = 100;
double width = 200;
double height = 150;
Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height);
g2.draw(rect);
Ellipse2D ellipse = new Ellipse2D.Double();
ellipse.setFrame(rect);
g2.draw(ellipse);
g2.draw(new
Line2D.Double(leftX,topY,leftX+width,topY+height));
double centerX = rect.getCenterX();
double centerY = rect.getCenterY();
double radius = 150;
Ellipse2D circle = new Ellipse2D.Double();
circle.setFrameFromCenter(centerX,centerY,centerX+radius,center Y+radius);
g2.draw(circle);
}
}
五、颜色
Graphics2D类中的setPaint方法允许你为图形上下文或组件上的后续绘制操作选择可用的颜色。如要使用多种颜色进行绘制,那么可以先选择一种颜色,进行绘制;然后选择另
一种颜色,再进行绘制。
Color类被用来定义颜色。Java.awt.Color类提供了代表13种标准颜色的常量值。如:BLACK、BLUE、CYAN、CARK_GRAY、GRAY、GREEN、LIGHT_GRAY、MAGENTA、ORANGE、PINK、RED、WHITE、YELLOW。
例如:
g2.setPaint(Color.RED);
g2.drawString(“Warning”,100,100);
可以通过创建Color对象来定制颜色,这时候需要提供该颜色的红、绿、蓝颜色构成,即RGB。三种色彩都是用0-255(也就是一个字节)之间的号数表示的,Color的构造器如下:
Color(int redness,int greenness,int blueness)
例如:
g.setPaint(new Color(0,128,128));//灰暗的蓝绿色
g.drawString(“Welcome!”,75,125);
设置背景颜色的方法是使用Component类(JPanel类的祖先)中的setBackground方法,setForeground方法被用来设定在组件上进行绘制的默认颜色。
Java在SystemColor类中预定义了更多的颜色名字。该类的常量封装了用户系统的各种颜色值。例如,frame.setBackground(SystemColor.window),会把框架的背景颜色设成用户桌面上所有窗口使用的默认值。(容器被重新绘制的时候,将会填充背景颜色。)当你要使你程序中的用户界面元素同用户桌面上已有的其他元素颜色匹配时,那么使用SystemColor类中的颜色值非常有用。看JDK帮助文档。
你可以用一个颜色(或者更普通的是,用当前的绘制设定)来填充闭合形状(例如矩形或椭圆)的内部区域。只需用fill代替draw。
例子:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class FillTest {
public static void main(String[] args) {
FillFrame frame = new FillFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
class FillFrame extends JFrame{
public FillFrame(){
setTitle("FillTest");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
FillPanel panel = new FillPanel();
Container contentPane = getContentPane();
contentPane.add(panel);
}
public static final int DEFAULT_WIDTH = 400;
public static final int DEFAULT_HEIGHT = 400;
}
class FillPanel extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
double leftX = 100;
double topY = 100;
double width = 200;
double height = 150;
Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height);
g2.setPaint(Color.RED);
g2.fill(rect);
Ellipse2D ellipse = new Ellipse2D.Double();
ellipse.setFrame(rect);
g2.setPaint(new Color(0,128,128));
g2.fill(ellipse);
g2.draw(new
Line2D.Double(leftX,topY,leftX+width,topY+height));
double centerX = rect.getCenterX();
double centerY = rect.getCenterY();
double radius = 150;
Ellipse2D circle = new Ellipse2D.Double();
circle.setFrameFromCenter(centerX,centerY,centerX+radius,centerY+ra dius);
g2.draw(circle);
}
}
六、文本和字体
我们常需要使用不同的字体显示文本。可以根据字体外观名(简称字体名)来指定字体。字体外观名是由字体家族名,如“Helvetica”和可选的后缀名,如“Bold”组合而成的。
如果想找出某个计算机上的可用字体,可以调用GraphicsEnvironment类的getAvailableFontFamilyNames方法来实现。该方法返回包含所有可用字体名字的字符串数组。GraphicsEnvironment类描述了用户系统上的图形环境,可以使用静态方法getLocalGraphicsEnvironment来得到该类的一个实例。
例子:
import java.awt.GraphicsEnvironment;
public class ListFonts {
public static void main(String[] args) {
String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment()
.getAvailableFontFamilyNames();
for(int i=0; i System.out.println(fontNames[i]); } } } 要用一种字体绘制字符,必须首先创建一个Font类的对象,指定字体名、字体风格和字体大小。例如:Font helvb14 = new Font(“Helvetica”,Font.BOLD,14);。参数1为字体名,参数二为字体的风格(plain、bold、italic和bold italic),其可选值分别为Font.PLAIN、Font.BOLD、Font.ITALIC、Font.BOLD+Font.ITALIC。 七、图像 如果图像存储在本地文件中,调用:Image image = ImageIO.read(new File(filename));。如果要在网络上得到图像文件,那么要提供URL:Image image = ImageIO.read(new URL(urlname));。显示这个图像时,使用Graphics类中的drawImage 方法。 例子: import java.awt.*; import java.awt.event.*; import javax.swing.*; class ImagePanel extends JPanel { public ImagePanel() { image = Toolkit.getDefaultToolkit().getImage ("blue-ball.gif"); MediaTracker tracker = new MediaTracker(this); tracker.addImage(image, 0); try { tracker.waitForID(0); } catch (InterruptedException e) {} } public void paintComponent(Graphics g) { super.paintComponent(g); Dimension d = getSize(); int clientWidth = d.width; int clientHeight = d.height; int imageWidth = image.getWidth(this); int imageHeight = image.getHeight(this); g.drawImage(image, 0, 0, this); for (int i = 0; i * imageWidth <= clientWidth; i++) for (int j = 0; j * imageHeight <= clientHeight; j++) if (i + j > 0) g.copyArea(0, 0, imageWidth, imageHeight, i * imageWidth, j * imageHeight); } private Image image; } class ImageFrame extends JFrame { public ImageFrame() { setTitle("ImageTest"); setSize(300, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); Container contentPane = getContentPane(); contentPane.add(new ImagePanel()); } } public class ImageTest { public static void main(String[] args) { JFrame frame = new ImageFrame(); frame.show(); } } 第七章事件处理 一、Java事件监听 1、事件源(按钮)发出事件; 2、事件是AWT中定义的事件; 3、事件传递给监听器; 4、任何对象都可以被指定为一个事件监听器; 5、事件源有自己的方法允许我们向其注册事件监听器; 6、当事件源产生某个事件后,事件源就会向注册在那个事件上的所有监听器对象发出通知; 7、java是面向对象的语言,关于事件的信息封装在一个事件对象中; 8、所有事件对象都是从java.util.EventObject 派生而来; 9、不同的事件源产生不同种类的事件; 二、AWT事件处理工作机制 1、一个监听器对象是一个实现了专门的监听器接口的类的实例; 2、一个事件源是一个能够注册监听器并为他们发送事件对象的对象; 3、当事件发生时,事件源会把事件对象发送给注册的全部监听器 4、监听器对象会使用事件对象中的信息决定对象事件的反应; 三、注册监听器的方法 公式: eventSoureeObject.addEventListener(eventListenObject); 例如: JButton btn = new JButton myListener listener = new myListener ;//注册一个监听器 btn.addActionListener(listener)//调用这个监听器 class myListener implements ActionListener { public void actionPerformed(ActionEvent e){功能实现 } } 上面的代码要求监听器对象所属的类必须要实现合适的接口(这里是ActionListener 接口)。同Java中的所有接口一样,实现该接口意味着要提供接口中方法的实现。为了实现ActionListener接口,监听器类必须实现一个actionPerformed方法,它接收一个ActionEvent对象为参数。 例子1: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ButtonTest { public static void main(String[] args) { ButtonFrame frame = new ButtonFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); } } class ButtonFrame extends JFrame { public ButtonFrame() { setTitle("ButtonTest"); setSize(WIDTH, HEIGHT); // add panel to frame ButtonPanel panel = new ButtonPanel(); Container contentPane = getContentPane(); contentPane.add(panel); } public static final int WIDTH = 300; public static final int HEIGHT = 200; } class ButtonPanel extends JPanel { public ButtonPanel() { JButton yellowButton = new JButton("Yellow"); JButton blueButton = new JButton("Blue"); JButton redButton = new JButton("Red"); add(yellowButton); add(blueButton); add(redButton); ColorAction yellowAction = new ColorAction(Color.yellow); ColorAction blueAction = new ColorAction(Color.blue); ColorAction redAction = new ColorAction(Color.red); yellowButton.addActionListener(yellowAction); blueButton.addActionListener(blueAction); redButton.addActionListener(redAction); } private class ColorAction implements ActionListener { public ColorAction(Color c) { backgroundColor = c; } public void actionPerformed(ActionEvent event) { setBackground(backgroundColor); repaint(); } private Color backgroundColor; } } 可以在ButtonPanel中直接实现ActionListener接口,然后在方法中通过event.getSource()方法得到是谁触发了这种事件的按钮,然后分别判断进行赋值。如果有很多按钮的话,这种方法会很混乱。另一种方法是在方法中通过event.getActionCommand()方法得到触发这个事件的按钮标签的命令字符串,然后再用if…else方法进行比较后执行相应的代码。这也不是一个好的方法,因为当应用程序需要进行国际化时,那么按钮字符串都要重新更改。 例子2,改变观感: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PlafTest { public static void main(String[] args) { PlafFrame frame = new PlafFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); } } class PlafFrame extends JFrame { public PlafFrame() { setTitle("PlafTest"); setSize(WIDTH, HEIGHT); PlafPanel panel = new PlafPanel(); Container contentPane = getContentPane(); contentPane.add(panel); } public static final int WIDTH = 300; public static final int HEIGHT = 200; } class PlafPanel extends JPanel { public PlafPanel() { makeButton("Metal", "javax.swing.plaf.metal.MetalLookAndFeel"); makeButton("Motif", "com.sun.java.swing.plaf.motif.MotifLookAndFeel"); makeButton("Windows", "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } void makeButton(String name, final String plafName) { JButton button = new JButton(name); add(button); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { try { UIManager.setLookAndFeel(plafName); SwingUtilities.updateComponentTreeUI (PlafPanel.this); } catch(Exception e) { e.printStackTrace(); } } }); } } 四、内部类 一个类内可以有其它的类,这个类就叫做内部类( $ ) 内部类: 1、类中可以包含另一个类; 2、方法只能调用其他方法,不能嵌套定义方法、定义类 3、内部类(inner)中可以使用包含类(outer)中的所有数据,但外部类不能使用内部类中的数据。 五、匿名类 1、可以用一个临时变量来接收具体的值,但如果这值以后不再使用,那么可以不必创建变量而直接使用此值 如:String s= new String ("HI"); System.out.println(s); 另一种形式: System.out.println(new Stting("HI")); 2、如果只需内部类的一个对象,就不必给该类一个名字: 匿名内部类 ActionListener addr=new ActionListener() { public void actionPerformed(ActionEvent e) { //具体实现 } }; 3、上例创建了一个实现了ActionListener 接口的类新的对象,这里需要实现actionPerformed方法 4、用于构造对象的任何参数都要放在跟在超类名字后面的括号中:new SuperType(construction parameters) {//内部类的字段及方法} 5、在这里SuperType可以是一个接口,那么内部类实现了该接口,可以是一个类则内部类继承了此类。 6、匿名内部类不能有构造器。 7、构造参数被传递到超类的构造器中 8、如内部类实现了一个接口,那么该内部类的构造器不能有任何参数。 基本形式如下: new interfaceType(){methods and data} 六、AWT事件结构 1、各个监听器中需要实现的方法,各有各监控的事件,如ActionListener中 actionPerformed的参数提供的就是一个ActionEvent。 2、java中的事件处理是面向对象的,所有的事件都从java.util包中的EventObject 扩展而来。 3、EventObject有一个子类AWTEvent,它是所有AWT事件类的父类。 4、有些swing组件能生成其他事件类型对象,但是,它们直接扩展EventObject而非 AWTEvent。 5、事件对象封装了用于事件源同监听器通信的事件信息,如有必要,可以分析传递各 监听器对象的事件对象。如可在按钮中用getSource方法。 6、对于java程序员来说,有些AWT事件类并无实际应用,如AWT把PaintEvent对象 插入事件队列中,但这些对象并不传递到监听器。Java程序员应重载paintComonent 方法来控制重绘。 7、尽管javax.swing.event包中包含了很多swing组件专用的监听器接口,但通常对 于事件处理来说,我们仍然使用基本的AWT监听器接口。 8、原理:一个想接收某一事件的类必须实现一个监听器接口。这个类要在事件源中注 册自己。然后,它接收所要的事件对象,并通过监听器接口中的方法做出相应的处 理。 AWT事件类的继承关系图 EventObject (事件对象) ↑ AWTEvent (AWT事件) ↑————————————————————————————---------------- ↑↑↑↑↑ ActionEvent Adjustment Component Item Text (行为事件) (调整事件)(组件事件)(项目)(文本) ↑————————————————————————————----------------- ↑↑↑↑↑ContainerEvent Focus Input Paint Window (容器)(焦点)(输入)(画图)(窗口) ↑ -------------------- ↑↑ KeyEvent MouseEvent ←MouseWheelEvent (键盘)(鼠标) 实际会被传递到监听器的AWT事件类型: ActionEvent AdjustmentEvent ComponentEvent ContainerEvent FocusEvent WindowEvent ItemEvent KeyEvent MouseEvent MouseWheelEvent TextEvent Java.awt.event包中的14个监听器接口: ActionListener AdjustmentListener ComponentListener ContainerListener FocusListener ItemListener KeyListener MouseListener MouseMotionListener MouseWheelListener TextListener WindowListener WindowFocusListener WindowStateListener 七、适配器类 1,并非所有接口都只有一个需要实现的方法。 2,为了简化任务,为每个具有不止一个方法的AWT监听器提供一个类,该类实现了对 应接口的全部方法。 3,每个方法都是空实现。 4,可以通过继承适配器来实现需要的动作 5,只有一个方法的接口不需适配器 例子:捕获窗口事件: 说明:当用户关闭框架时,你可能希望弹出一个对话框警告用户未保存工作可能会丢 失,在用户确认之后,才退出程序。当程序用户试图关闭框架窗口时,JFrame对象是WindowEvent的事件源,如果要捕获这个事件,必须有一个适当的监听器对象并把它添加到 窗口监听器列表中。窗口监听器必须是实现了WindowListener接口的类的对象。WindowListener接口有七个方法(看JDK帮助文档),分别对应于七个可能发生的独立窗口 事件。下面使用窗口适配器。要扩展WindowAdapter类。 有多个方法的监听器接口具有相应的适配器类。适配类定义了接口中所有的方法,但是 这些方法什么也不做。使用适配器类的目的是为了节省编程时间,可以在只需要实现监听器 接口中的少数几个方法时使用它。 适配器类的列表: ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter Windowadapter 说明:其余四个接口都只有一个方法,因此无需适配类。 八、事件处理总结 AWT明确区分语义事件和低层事件。语义事件是用于表达用户动作(如“点击按钮”) 的事件;因此,ActionEvent是语义事件。低层事件是使这些成为可能的事件。在按钮点击 的案例中,它包括鼠标按下、一系列鼠标移动和鼠标弹起(只有当鼠标在按钮区域弹起时才 引发)事件,它也可能是用户通过TAB键选择按钮并用空格键激活它时的按键事件。类似地, 调整滚动条是个语义事件;而拖动鼠标则是一个低层事件。 Java.awt.event包中有四个语义事件类: ActionEvent(对应按钮点击、菜单选择、选择列表项或者在文本域中输入ENTER)。 AdjustmentEvent(用户调整一个滚动条) ItemEvent(用户从一组选择框或者列表项中选择一个) TextEvent(文本域或者文本框中内容发生改变) 有六个低层事件类: ComponentEvent(组件被缩放、移动、显示或者隐藏,它是所有低层事件的基类)KeyEvent(一个键被按下或者释放) MouseEvent(鼠标键被按下、释放,鼠标移动或者拖动) MouseWheelEvent(鼠标轮被滚动) FocusEvent(组件得到焦点或者失去焦点) WindowEvent(窗口被激活、减活、图标化、还原或者关闭,窗口状态改变) ContainerEvent(添加或删除一个组件) 事件源是用户界面组件、窗口和菜单。操作系统会把用户的动作(如鼠标移动和击键操作)通知给感兴趣的事件源。事件源在一个事件对象中描述事件的特性。事件源还保持有一组监听器----当事件发生时需要调用的对象。当事件发生时,事件源调用监听器接口中的适当方法把事件信息传递给多个监听器。事件源是通过把适当的事件对象传递给监听器类的方法来实现这一点的。监听器通过分析事件对象以找出关于这个事件更多的信息。 事件处理总结