簡體   English   中英

了解java中的事件偵聽器

[英]Understanding event listeners in java

我是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

歡呼:)

通常定義一個類,實例化一個實例,然后使用該實例分別完成:

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

我認為最后這種格式會損害可讀性。 我格式化我的匿名類,類似於它的最后一種格式 - 更好的可讀性(恕我直言)值得多一些額外的空白。

分解......

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

invokeLater()SwingUtilities上的一個靜態方法,它將Runnable作為參數。

注意最后的右括號和分號; 這只是一種標准方法,對吧?

中間的東西只是創建一個Runnable的新實例來傳遞給方法。 如果我將它分配給參考,你會更好地認識到它:

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

這里的分號或括號沒有什么困惑。 基本上,這是在Java中分配匿名類的一種方法。 如果您不熟悉此構造,您當然可以創建自己的類來實現Runnable,並將其分配如下: -

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

然后你可以讓它看起來更好,像這樣: -

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

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

那是一個匿名的內部階級 這是一個非常常見且方便的結構。 閱讀我鏈接的教程!

該代碼適用於匿名類 搜索並閱讀此主題。

分號分別終止賦值方法調用。

PS。 我一直認為這個名字是誤導性的,因為你真正得到的是一個對象。

我將嘗試舉例說明第二個例子。

在這種情況下,invokeLater方法需要任何 實現 Runnable接口的對象。

例如,這是在沒有匿名類的情況下編寫相同內容的另一種方法:

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

你的例子可能是:

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

但是因為這個Example類很可能你只使用它一次,所以使用匿名類會更方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM