了解java中的事件侦听器

时间:2011-01-22 16:48:10

标签: java listener inner-classes

我是java的新手,我还在尝试理解这种语言,所以如果这个问题听起来很无趣,我会道歉。

我听不到有些关于听众的事情,有时你可以看到以这种方式宣告听众:

    private View.OnClickListener onSave=new View.OnClickListener() {
public void onClick(View v) {

// Some code

}

};

或:

javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });

最令我困惑的是该方法结束后的分号和括号。

我理解内部类是为了拥有多个侦听器,但我不理解这个变量和方法的混合声明。

它的目的是什么?

如何宣布?

WTF? :P

欢呼:)

6 个答案:

答案 0 :(得分:3)

通常定义一个类,实例化一个实例,然后单独使用该实例:

class MyListener extends OnClickListener {
    public void onClick(View v) {
        // my onClick code goes here
    }
}

MyListener foo = new MyListener();

button.setOnClickListener(foo);

但有时您需要一个只能立即实例化一次的子类,这通常是事件处理程序的情况。定义它并使用匿名(内部)类将其实例化是很方便的:

OnClickListener foo =
    new OnClickListener() {
        public void onClick(View v) {
            // my onClick code goes here
        }
    };

button.setOnClickListener(foo);

但由于foo仅使用一次,我们可以更进一步,并消除局部变量foo,所以:

button.setOnClickListener(foo);

可以格式化为:

button.setOnClickListener(
    foo
);

替换为foo

的值
button.setOnClickListener(
    new OnClickListener() {
        public void onClick(View v) {
            // my onClick code goes here
        }
    }
);

再次重新格式化,没有太多的空白来查看它,因为它经常写着:

button.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        // my onClick code goes here
    }
});

我认为最后这种格式会影响可读性。我格式化我的匿名类,类似于它的最后一种格式 - 更好的可读性(恕我直言)值得多一些额外的空格。

答案 1 :(得分:2)

分解......

javax.swing.SwingUtilities.invokeLater(Runnable runnable);

invokeLater()SwingUtilities上的静态方法,它以Runnable作为参数。

注意最后的右括号和分号;它只是一种标准方法,对吧?

中间的东西只是创建一个Runnable的新实例来传递给方法。如果我将它分配给参考,你会更好地认识到它:

Runnable parameter = new Runnable() 
{
    public void run() 
    {
        createAndShowGUI();
        }
    }
};

答案 2 :(得分:2)

这里没有任何关于分号或括号的困惑。基本上,这是在Java中分配匿名类的一种方法。如果您不熟悉此构造,您当然可以创建自己的类来实现Runnable,并将其分配如下: -

public class YourRunnableClass implements Runnable {
   public void run() {
      ...
   }
}

然后你可以让它看起来更漂亮,就像这样: -

javax.swing.SwingUtilities.invokeLater(new YourRunnableClass());

P / S:尽量不要在帖子中使用“WTF”。 :)

答案 3 :(得分:1)

这是一个anonymous inner class。这是一个非常常见且方便的结构。阅读我链接的教程!

答案 4 :(得分:1)

该代码适用匿名类。搜索并阅读此主题。

分号分别终止赋值方法调用。

PS。我一直认为这个名字是误导性的,因为你真正得到的是一个对象。

答案 5 :(得分:1)

我将尝试举例说明第二个例子。

在这种情况下,invokeLater方法需要任何对象实现 Runnable接口。

例如,这是在没有匿名类的情况下编写相同内容的另一种方法:

class Example implements Runnable{
  public void run(){
    // do something
  }
}

你的例子可能是:

javax.swing.SwingUtilities.invokeLater(new Example());

但是因为这个Example类很可能你只使用它一次,所以使用匿名类会更方便。