----------------------
android培训、
java培训、期待与您交流! ----------------------
老老实实的做人,踏踏实实的做事。继续复习GUI。
以鼠标在窗口按下时作为起点,鼠标释放时为终点,划出一条直线,并在2个点处打印坐标。
package GUI;
import java.awt.Color;
import java.awt.Graphics;
public class MyLine {
//记录起点、终点的坐标
private int x1,x2,y1,y2;
public MyLine(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
}
//这个方法和在TestDrawLine中的draw()十分类似。
public void drawMe(Graphics g){
g.setColor(Color.RED);
g.drawLine(x1, y1, x2, y2);
g.drawString("(" + x1 + "," + y1 +")", x1, y1);
g.drawString("(" + x2 + "," + y2 +")", x2, y2);
}
}
package GUI;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Enumeration;
import java.util.Vector;
public class TestDrawLine extends Frame {
/**
* 以鼠标在窗口按下时作为起点,鼠标释放时为终点,划出一条直线,并在2个点处打印坐标。
*/
int x1,y1,x2,y2;
//用集合类存储划的线,即MyLine对象。
Vector<MyLine> vLines = new Vector<MyLine>();
public void init(){
this.setSize(400, 400);
this.setTitle("划线");
//给窗口的关闭按钮注册事件监听器
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
//给窗口注册鼠标的按下,释放事件监听器。
this.addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent e) {
//获得当前按下的坐标
x1 = e.getX();
y1 = e.getY();
}
/* 不能使用鼠标的单击
* @Override
public void mouseClicked(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
}
*/
@Override
public void mouseReleased(MouseEvent e) {
//获得鼠标释放时的坐标
x2 = e.getX();
y2 = e.getY();
//将划线的功能设置为一个方法,要修改划线的功能时,只需要修改这个方法的方法体。
draw();
}
});
this.setVisible(true);
}
public void draw(){
//创建一个Graphics对象
Graphics g = getGraphics();
//设置颜色
g.setColor(Color.RED);
//划直线
g.drawLine(x1, y1, x2, y2);
//注意写入字符串的时候,实际写的是一个矩形,参数为矩形的左下角,与别的编程语言不同。
g.drawString("(" + x1 + "," + y1 +")", x1, y1);
g.drawString("(" + x2 + "," + y2 +")", x2, y2);
vLines.add(new MyLine(x1,y1,x2,y2));
}
@Override
/*对组件重绘的理解:
*
* 当组件改变大小等操作(即曝光)时,AWT线程会调用部件的paint()方法。
* paint()方法是由AWT线程调用和管理的,我们的应用程序不应该直接的调用paint()方法。
* 如果想让窗口的内容重绘,则调用repaint()方法,然后repaint()方法会调用部件的update()方法,
* update()方法,先将组件表面的内容清除,然后调用paint()方法。
*/
public void paint(Graphics g) {
//得到集合中的每个对象,重新将他们画出来。
Enumeration<MyLine> e = vLines.elements();
while(e.hasMoreElements()){
MyLine ml = (MyLine) e.nextElement();
ml.drawMe(g);
}
}
public static void main(String[] args) {
new TestDrawLine().init();
}
}
事件监听器的注册:
package GUI;
import java.awt.Frame;
public class MyFrame {
/**
* 处理发生在某个GUI组件上的XXXEvent事件,通用编写流程:
* 1.编写实现了XXXListener接口的事件监听器类
* 2.编写事件监听器类中的用于处理该事件的方法。
* 3.调用该组件的addXXXListener方法,将事件监听器类的实例对象注册到这个GUI组件上。
*/
public static void main(String[] args) {
Frame f = new Frame("GUI");
f.setSize(300, 300);
f.setVisible(true);
//注册事件监听器
f.addWindowListener(new MyWindowListener());
//采用事件适配器来注册监听器
f.addWindowListener(new MyWindowAdapter());
}
}
package GUI;
import java.awt.Window;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
/*
* 以实现接口的方式来编写自己的事件监听器类
*/
public class MyWindowListener implements WindowListener {
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
//获取事件源的几种方法。
//方法一
e.getWindow().setVisible(false);//只是将窗口隐藏
e.getWindow().dispose();//窗口对象从内存中消失
System.exit(0);
//方法二
Window w = (Window)e.getSource();
w.setVisible(false);
w.dispose();
System.exit(0);
//方法三
((Window)e.getComponent()).setVisible(false);
((Window)e.getComponent()).dispose();
System.exit(0);
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
}
package GUI;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/*
* 以继承JDK中提供的事件适配器类来编写自己的事件监听器。
* 使用事件适配器,可以简化代码的处理,只需要编写需要处理的事件的那部分代码。
* 由于java只支持单继承,使用事件适配器还是有一定的局限性。
*/
public class MyWindowAdapter extends WindowAdapter {
@Override
public void windowClosing(WindowEvent e) {
e.getWindow().setVisible(false);
e.getWindow().dispose();
System.exit(0);
}
}
package GUI;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyFrameButton {
/**
* 给一个窗口和窗口中的按钮注册事件 ,当单击按钮时窗口关闭。
* 1.使用匿名内置类
* 2.使用内部类
* 3.可以让窗口实现ActionListener接口,实现actionPerformed方法,然后给按钮注册事件监听器。
*/
Frame f = new Frame("GUI");
public void init(){
Button b = new Button("关闭窗口");
// 使用匿名内置类来给按钮注册事件
b.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
f.setVisible(false);
f.dispose();
System.exit(0);
}
});
f.add(b);
f.setSize(300, 300);
f.addWindowListener(new MyWindowAdapter());
f.setVisible(true);
}
public static void main(String[] args) {
new MyFrameButton().init();
}
}
/*
* 思考:Frame f = new Frame("GUI");为什么不能放置在init()这个方法体中?
* 答:如果当实例化一个对象时,只为该对象的成员变量分配内存,假如放在了init()方法体中,当
* 创建内置类时,需要调用的f还不存在。所以提示将f定义为final。当我们把Frame f = new Frame("GUI");
* 放置在MyFrameButton类中时,f属于成员变量,实例化MyFrameButton时,已经给f分配内存,当
* 在init()方法体中创建匿名对象时能找到f。
*/
修改组件的默认事件处理方式:
package GUI;
import java.awt.AWTEvent;
import java.awt.Button;
import java.awt.event.MouseEvent;
public class MyButton extends Button {
public MyButton(String title){
super(title);
/*
* 修改组件的默认事件处理方式
*
* 调用enableEvents()方法后,可以在即使没有注册事件监听器的情况下,
* 组件也能够对某些类型的事件进行响应和产生相应的事件对象。
*/
this.enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK);
}
private MyButton friend = null;
public void setFriend(MyButton friend) {
this.friend = friend;
}
@Override
protected void processMouseMotionEvent(MouseEvent e) {
setVisible(false);
friend.setVisible(true);
}
}
package GUI;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestMyButton extends Frame {
/**
* 在窗口上显示一个按钮,一旦鼠标移动的这个按钮上,按钮就移动到其他的位置。
*/
public void init(){
this.setSize(400, 400);
this.setTitle("测试");
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
this.setVisible(true);
}
public static void main(String[] args) {
TestMyButton tmb = new TestMyButton();
MyButton mb1 = new MyButton("你来抓我啊!");
MyButton mb2 = new MyButton("你来抓我啊!");
mb1.setFriend(mb2);
mb2.setFriend(mb1);
tmb.add(mb1,"North");
tmb.add(mb2,"South");
tmb.init();
mb2.setVisible(false);
}
}
老老实实的做人,踏踏实实的做事。继续复习GUI。