理解java中的事件侦听器

理解java中的事件侦听器,java,listener,inner-classes,Java,Listener,Inner Classes,我是java新手,我仍在努力理解java语言,因此,如果这个问题听起来像是胡说八道,我很抱歉 我对侦听器有些不理解,有时您可以看到一个侦听器以这种方式声明: private View.OnClickListener onSave=new View.OnClickListener() { public void onClick(View v) { // Some code } }; 或: 最让我困惑的是方法结尾后的分号和括号 我理解内部类是为了有多个监听器,但我不理解变量和方法的混

我是java新手,我仍在努力理解java语言,因此,如果这个问题听起来像是胡说八道,我很抱歉

我对侦听器有些不理解,有时您可以看到一个侦听器以这种方式声明:

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

// Some code

}

};
或:

最让我困惑的是方法结尾后的分号和括号

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

它有什么目的

如何申报

WTF?:P

干杯:)

这是一个好主意。这是一个非常常见和方便的构造。阅读我链接到的教程

把它分解

javax.swing.SwingUtilities.invokeLater(Runnable runnable);
invokeLater()
SwingUtilities
上的一个静态方法,它将
Runnable
作为参数

注意结尾处的右括号和分号;这只是一种标准方法,对吗

<>中间的东西只是创建一个可运行的新实例传递给该方法。如果我将其分配给参考,您会更好地识别它:

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

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

分号分别在方法调用时终止赋值


另外,我一直认为这个名字有误导性,因为你真正得到的是一个物体

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

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

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

class Example implements Runnable{
  public void run(){
    // do something
  }
}
你的例子可以是:

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

但是由于这个示例类可能只使用一次,因此使用匿名类更方便。

这里的分号或括号没有什么令人困惑的地方。基本上,这是在Java中分配匿名类的一种方法。如果您不习惯此构造,您当然可以创建自己的类来实现Runnable,并按如下方式分配它:-

public class YourRunnableClass implements Runnable {
   public void run() {
      ...
   }
}
javax.swing.SwingUtilities.invokeLater(new YourRunnableClass());
然后你可以让它看起来更好,像这样:-

public class YourRunnableClass implements Runnable {
   public void run() {
      ...
   }
}
javax.swing.SwingUtilities.invokeLater(new YourRunnableClass());

附言:尽量不要在帖子中使用“WTF”。)

通常,分别定义类、实例化实例和使用该实例:

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

MyListener foo = new MyListener();

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
    }
});

我认为最后一种格式有损可读性。我的匿名类的格式类似于倒数第二种格式——更好的可读性(IMHO)值一点额外的空白。

您在内部类的末尾忘了一个分号,但在其他方面回答得不错!类似于[Java中如何使用匿名(内部)类?]()。如果您想查看匿名内部类的更详细描述,请查看以下内容: