[英]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.