1. 什么是事件,事件源和处理器,并描述三者的工作关系。
事件:用户对GUI组件的一个操作,称之为一个事件。
事件源:发生事件的组件就是事件源。
事件处理器:某个java类中负责处理时间的成员方法。
1) 先在组件上进行事件监听器注册
2) 当组件受到外部的作用时产生一个事件对象
3) 事件监听器把组件对象传给事件处理器进行处理
2. 描述事件处理的编码实现过程。
1) 首先产生一个组件对象
2) 编写组件的监听器类,事件监听器类内部相关的方法。
3) 在组件上添加相关的监听器对象。
3. 描述事件监听器类和事件适配器类的关系和区别。
事件适配器类是事件监听器类的子类。事件适配器类可以只重写用的着的方法,而事件监听器类实现的是接口,要把接口里所有的方法都实现了。
4. 描述在窗口上画直线的程序编写过程和组件重绘的原理
1) 编写一个直线类:设置起点和终点的坐标为四个成员变量,一个构造方法得到起点和终点的四个坐标。一个画线的方法,设置线的颜色,界面上字体的格式,并根据起点坐标和终点坐标画线。
package GUI;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class MyLine {
private int orgX;
private int orgY;
private int endX;
private int endY;
public MyLine(int orgX,int orgY,int endX,int endY)
{
this.orgX=orgX;
this.orgY=orgY;
this.endX=endX;
this.endY=endY;
}
public void drawMe(Graphics g)
{
g.setColor(Color.RED); //设置字体的颜色为红色
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,30));//设置字的格式
g.drawString(orgX+","+orgY, orgX, orgY);//在初始坐标处划线
g.drawString(endX+","+endY, endX, endY);//在末坐标处划线
g.drawLine(orgX, orgY, endX, endY);
}
}
2) 在主类里:先用代码实现一个可以关闭的窗口,设置线的初始坐标和末尾坐标为全局变量,设置一个成员变量用来存储界面上每条线的横纵坐标。在构造方法里添加鼠标事件的适配器,在适配器里添加鼠标按下时的方法,获得线起始点的坐标。添加鼠标释放时的方法,获得线终点的方法,产生一个直线的对象并存到集合里去。然后调用重绘方法repaint在界面上进行绘图。
3)绘图方法paint:循环在集合里获得保存的直线对象,调用直线对象里的画线方法画线。
package GUI;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class DrawLine extends Frame {
int orgX;//初始点的横坐标
int orgY;//初始点的纵坐标
int endX;
int endY;
Vector vLines=new Vector();
public void paint(Graphics g)
{
Enumeration e=vLines.elements();
while (e.hasMoreElements()) {
MyLine line=(MyLine)e.nextElement();
line.drawMe(g);
}
}
public DrawLine()//添加构造方法
{
addWindowListener(new WindowAdapter(){//注册窗口适配器
public void windowClosing(WindowEvent arg0) {//重写关闭窗口的方法
dispose(); //释放该窗口
System.exit(0);//停止程序的运行
}
});
this.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e)
{
orgX=e.getX();//获得初始点的横坐标
orgY=e.getY();//获得初始点的纵坐标
}
public void mouseReleased(MouseEvent e)
{
endX=e.getX();//获得末点横坐标
endY=e.getY();//获得末点纵坐标
vLines.add(new MyLine(orgX,orgY,endX,endY));//存储坐标
repaint();//调用绘图方法,重绘直线
}
});
}
public static void main(String[] args) {
System.out.println("starting TestMyButton..");
DrawLine drawLine=new DrawLine();//实例化定义的创库
drawLine.setSize(400, 400);//设置窗口的大小
drawLine.setTitle("TestMyButton");
drawLine.setVisible(true);
}
}
5.
6.
7.重写计算器的添加按钮的方法
package calculator;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Calculator extends JFrame implements ActionListener {
JTextField jtf=new JTextField();
public Calculator()//添加构造方法
{
Container c=getContentPane();
jtf.setHorizontalAlignment(JTextField.RIGHT);
JPanel jp1=new JPanel();
GridLayout gl=new GridLayout(4,4);
jp1.setLayout(gl);
c.add(jtf,BorderLayout.NORTH);
c.add(jp1,BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//把按钮上要显示的数字都存在数组里
String [] ch={"1","2","3","+","4","5","6","-","7","8","9","*","0",".","=","//"};
for (int i = 0; i < ch.length; i++) {
JButton b=this.calButton(ch[i]);//调用方法,产生按钮
b.addActionListener(this);//给每个按钮添加监听器
jp1.add(b); //把按钮添加到案板上
}
}
public static void main(String[] args) {
System.out.println("starting TestStopWatch..");
Calculator t=new Calculator();
t.setSize(400, 400);//设置窗口的大小
t.setTitle("TestMyButton");
t.setVisible(true);
}
public void actionPerformed(ActionEvent arg0) {
jtf.setText(jtf.getText()+arg0.getActionCommand());
}
//根据输入的字符串产生一个按钮对象,并返回
public JButton calButton(String btnName)
{
JButton b=new JButton(btnName);
return b;
}
}