SwingUtilities.invokeLater(new Runnable() {
public void run() {
Example ex = new Example();
ex.setVisible(true);
}
});
這裏的一段代碼如下new Runnable()
。我如何理解這段代碼?我不記得我們可以直接將代碼塊傳遞給java中的任何對象。在Java中執行新操作後,代碼塊會執行什麼操作?
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Example ex = new Example();
ex.setVisible(true);
}
});
這裏的一段代碼如下new Runnable()
。我如何理解這段代碼?我不記得我們可以直接將代碼塊傳遞給java中的任何對象。在Java中執行新操作後,代碼塊會執行什麼操作?
這不是一個代碼塊。這是一個對象。
當你說,
new Runnable()
要創建實現Runnable接口的對象,特別是run()
方法。
正如方法名所示,invokeLater()
將在稍後的某個時間點調用可運行接口實現對象(或Runnable對象)的run()
方法。
另一個海報提到,這是一個匿名類的例子。這是一種真正便捷的機制,可以以更簡潔的方式快速編寫代碼。如果你不喜歡這個,你能做到這樣 -
創建一個實現Runnable一個新類 -
public class RunnableImplementation implements Runnable
{
public void run()
{
Example ex = new Example();
ex.setVisible(true);
}
}
然後,在您的示例代碼變得 -
SwingUtilities.invokeLater(new RunnableImplementation());
你能不能給我更多說明?什麼是對象?可運行?但尚未定義,我們如何才能新的呢?另外,爲什麼我們可以在main中定義一個函數? – OneZero 2013-04-29 19:27:55
@OneZero你不能在該電話之外「新」。它是匿名的。 – 2013-04-29 19:28:52
它創建了一個匿名內部類的實例。而不是從Runnable
中派生一個命名的類並創建它的一個實例,您可以將所有東西內聯。
參見。
您沒有傳遞任何代碼塊,你實際上是重寫Runnable
類
如何理解這段代碼的run
方法?這就是所謂的swing event queue
,它有助於防止併發問題。它按順序調用此隊列中每個Runnable
對象上的方法run()
。
您的代碼
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Example ex = new Example();
ex.setVisible(true);
}
});
相當於
SwingUtilities.invokeLater(new MyRunnable());
其中MyRunnable
是實現Runnable
接口與你的代碼,並且只用於此目的創建的,無法再次使用的類。
注意MyRunnable
不是實際的名稱,只是表明了它的意思。
這實際上是創建一個「在線」類。看到這個問題 - > [內嵌的Java類定義] [1] [1]:http://stackoverflow.com/questions/8913406/java-inline-class-definition – BlakeP 2013-04-29 19:28:37