…… ……
class ButtonJPanel extends JPanel
{
public ButtonJPanel()
{
JButton jb1 = new JButton("yellow");
JButton jb2 = new JButton("blue");
JButton jb3 = new JButton("green");

add(jb1);
add(jb2);
add(jb3);

ButtonListener jb1lis = new ButtonListener(Color.YELLOW);
ButtonListener jb2lis = new ButtonListener(Color.BLUE);
ButtonListener jb3lis = new ButtonListener(Color.GREEN);

jb1.addActionListener(jb1lis);
jb2.addActionListener(jb2lis);
jb3.addActionListener(jb3lis);

}
class ButtonListener implements ActionListener
{
private Color actioncolor;
public ButtonListener(Color c)
{
actioncolor = c;
}
public void actionPerformed(ActionEvent e)
{
setBackground(actioncolor);
}

}
}这段代码中有一个简单的按钮监听器实现改变容器的背景颜色;除了使用内部类;或者在监听器中构造容器;请问还有没有办法把这个监听器类单独出来实现对一个容器的操作呢?单独出来是不是就没有权限访问相应的容器了?
还有个问题是:这监听器能理解成一段if语句块吗?

解决方案 »

  1.   

    这段代码中有一个简单的按钮监听器实现改变容器的背景颜色;除了使用内部类;或者在监听器中构造容器;请问还有没有办法把这个监听器类单独出来实现对一个容器的操作呢?单独出来是不是就没有权限访问相应的容器了?
    还有个问题是:这监听器能理解成一段if语句块吗?.........
    单独出来是可以的,但是单独出来后,你没办法访问ButtonJPanel 里面的成员变量;只可以e.getSource()得到触发的按钮
    。。还有个问题是:这监听器能理解成一段if语句块吗?
    这个没有理解你的意思
      

  2.   

    楼上的;谢谢了;
    e.getSource()返回一个Event对象好像没什么用呢;
      

  3.   

    e.getSource() 返回的应该是一个被触发事件的按钮控件在当前代码中。
    楼主的问题比较不入门,个人感觉!不过一定要把监听器理解成一段 if 语句块也是有道理的,就 swing 的消息机制进行事件触发,我的理解简单的讲即有一个用来捕获所有 gui 消息的线程(具体方法好像是 awt event queue 什么的)在运行 swing 程序的同时被启动,它将捕获的动作类型与触发坐标点(假设为鼠标动作)在遍历所有的可见控件时用于 jcomponent.contains 方法判断是否触发了该控件。一旦触发确认将会执行该控件的 listeners 数组中 add 的监听接口的代码,而这里的这些代码就是你在上面代码中添加的如:jb1.addActionListener(jb1lis); 这样一个过程要是理解为 if 语句块哲学上是没有错的咯!
    对于问题“有没有办法把这个监听器类单独出来实现对一个容器的操作呢?单独出来是不是就没有权限访问相应的容器了?”就访问权限问题,没有什么神奇的地方,你只要参照 java 语法就可以了,不存在问题。至于将监听器独立出来实现的动机,我觉得楼主本身动机就有问题?如果一定要将其独立出来就将需要操作的容器做参数传入进去不就 OK 了,何况现在还可以直接通过 e 获取?不知道是不是我对你的意思理解有问题?