| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 754 人关注过本帖
标题:多监听器的 范例代码 中间有点不太懂
只看楼主 加入收藏
晓狐狸
Rank: 2
等 级:新手上路
威 望:3
帖 子:95
专家分:0
注 册:2006-4-6
收藏
 问题点数:0 回复次数:5 
多监听器的 范例代码 中间有点不太懂

import java.awt.*;
import java.awt.event.*;
//*****************多监听器范例代码*************
public class MyMulticast
{
public static void main(String [] args)
{
MulticastFrame frame = new MulticastFrame();
frame.show();
}
}

class MulticastFrame extends Frame
{
public MulticastFrame()
{
this.setTitle("MulticastTexting");
this.setSize(300,200);
MulticastPanel panel = new MulticastPanel();
this.add(panel);
this.addWindowListener(new MyWindowAdapter());
}
private class MyWindowAdapter extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
e.getWindow().dispose();
}
}

}

class MulticastPanel extends Panel
{
private Button closeAllButton;

public MulticastPanel()
{
Button newButton = new Button("新建");
this.add(newButton);
ActionListener newListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
makeNewFrame();
}
};
newButton.addActionListener(newListener);

closeAllButton = new Button("关闭全部");

this.add(closeAllButton);
}
private void makeNewFrame()
{
//*********************重点部分********************************
final BlankFrame frame = new BlankFrame();// 静态引用变量

frame.show();

ActionListener closeAllListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
frame.dispose();//为什么可以关闭掉所有的窗口呢?实在有点不太明白呀 帮我解释下
}
};
closeAllButton.addActionListener(closeAllListener);//注册监听器
}
//*********************************************************************************

}
class BlankFrame extends Frame
{
private static int counter=0;
public BlankFrame()
{
counter++;
this.setTitle("窗体"+counter);
this.setSize(200,150);
this.setLocation(30*counter,30*counter);
}
}

搜索更多相关主题的帖子: 代码 监听 范例 
2006-04-08 14:17
meng136138
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2006-2-15
收藏
得分:0 
我也看不懂啊
那位高手指点
2006-04-08 21:48
伯约
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2006-4-5
收藏
得分:0 
好像听说dispose()函数不能释放内存,这我也不明白.
并且所有的资源释放都是有JVM来管理的,在没有其他线程在运行的话,当所有的窗口都被dispose了之后,JVM也会退出.我想全部关闭也就是JVM退出了吧,但我也不懂!

2006-04-08 23:57
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 

private void makeNewFrame()
{
//*********************重点部分********************************
final BlankFrame frame = new BlankFrame();// 静态引用变量

frame.show();

ActionListener closeAllListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
frame.dispose();//为什么可以关闭掉所有的窗口呢?实在有点不太明白呀 帮我解释下
}
};
closeAllButton.addActionListener(closeAllListener);//注册监听器
}

=========================================
为什么会关闭掉所有的窗口呢,其实想想很容易知道的,closeAllListener是一个内部类,然后你注意这一句closeAllButton.addActionListener(closeAllListener);//注册监听器

它的意思就是说,它每一次调用makeNewFrame()方法的时候,就会自动的在“关闭全部”这个按钮上注册一个监听器,所以当你按了“关闭全部”这个按钮的时候,它就会调用每一个注册在它上面的监听器,然后一个一个的,把所有的窗口都关掉了,在这里有一点你要搞清楚,它是为每一个窗口都注册了监听器的。
虽然每个窗口的名字都 是一样的,但是它都是局部变量名,当然可以一样。
如果此程序把 BlankFrame放出去,做为全局变量的话,就不一样了,它指向的只是最后一个窗体的引用。
==============================
class MulticastPanel extends Panel
{
BlankFrame frame;
private Button closeAllButton;

public MulticastPanel()
{
Button newButton = new Button("新建");
this.add(newButton);
ActionListener newListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
makeNewFrame();
}
};
newButton.addActionListener(newListener);

closeAllButton = new Button("关闭全部");

this.add(closeAllButton);
}
private void makeNewFrame()
{
//*********************重点部分********************************
frame = new BlankFrame();// 静态引用变量

frame.show();

ActionListener closeAllListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
frame.dispose();//为什么可以关闭掉所有的窗口呢?实在有点不太明白呀 帮我解释下
}
};
closeAllButton.addActionListener(closeAllListener);//注册监听器
}
//*********************************************************************************

}
如果改成上面的话,就当你点新建窗口的时候,确实会新建一个,但是你点关闭全部的时候,只会关掉最后打开的那个窗口。这就是不同之所在。


可惜不是你,陪我到最后
2006-04-09 10:29
晓狐狸
Rank: 2
等 级:新手上路
威 望:3
帖 子:95
专家分:0
注 册:2006-4-6
收藏
得分:0 
似乎是懂了 也就是一个组件上有N多个 监听器

点击这个组件 触发的事件会传送给 每一个监听器 然后就会将关闭窗口这个动作执行N次

是这么理解的吗?

2006-04-09 12:15
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
就是这么理解的,主要是看你的当时注册的时候所指向的引用有没有改
如果是局部变量的话,都是没有改变的,如果用的是全局变量的话,引用就会一直会改,一直指向最后一个窗体的引用,

可惜不是你,陪我到最后
2006-04-09 12:35
快速回复:多监听器的 范例代码 中间有点不太懂
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017892 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved