Ich habe Schwierigkeiten, diesen einfachen Code zu verstehen:
%Vor%Kann mir bitte jemand erklären, wie es funktioniert (in einfachen Worten, weil ich ein Neuling bin)? Dieser kurze Code ist ein Teil dieses größeren Codes .
Um genauer zu sein, habe ich die folgenden Fragen:
Ich möchte noch einmal betonen, dass ich ein Neuling bin und die Verwendung von "speziellen" und "technischen" Wörtern noch mehr Fragen aufwirft.
Vielen Dank im Voraus, wenn Sie sich entscheiden, mir zu helfen!
Die kürzeste Antwort, die ich geben kann, ist:
Runnable
ist eine Java-Schnittstelle, die einen Typ darstellt, der eine run
-Methode definiert. Jede Klasse, die diese Schnittstelle implementiert, muss eine Implementierung für run
bereitstellen. Runnable
s stellen Aufgaben dar, die von anderen Teilen Ihres Systems ausgeführt werden sollen. Thread
ist eine bekannte Runnable
.
Wenn Sie Code haben, der wie new InterfaceName() { //implementation }
aussieht, wird das eine anonyme Klasse genannt. Der Punkt einer anonymen Klasse besteht darin, eine einmalige Klasse zu erstellen, die den Schnittstellentyp implementiert. Diese Klasse hat keinen Namen und daher können wir uns nie wieder darauf beziehen. Es wird nur hier verwendet.
Ohne viel über Swing zu wissen, sieht es so aus, als ob SwingUtilities.invokeLater()
eine Runnable
akzeptiert und ... nun, ich würde annehmen, dass es später aufgerufen wird (wie viel später wahrscheinlich in den JavaDocs beschrieben wird). Aber der Grund, warum Sie run
hier einfach als einen weiteren Methodenaufruf definieren würden, ist, dass irgendein Code in SwingUtilities
die Methode run
für diese Runnable
aufrufen wird; In der Tat ist alles, was es möglicherweise über Runnable
wissen kann, dass es eine Methode mit der Signatur public void run()
definiert, weil das die einzige Methode ist, die in der Schnittstelle Runnable
definiert ist.
Nun, ich denke, das war schließlich nicht zu kurz.
Es ist eine anonyme innere Klasse .
Sie definieren drei Dinge:
run
innerhalb dieser Klasse In diesem Beispiel muss eine Operation ( createAndShowGUI()
) im Swing-Thread ausgeführt werden. Sie können nicht in einen anderen Thread in der Mitte eines Methodenaufrufs "springen". Stattdessen platzieren Sie ein Objekt (die neue Instanz, die Sie erstellt haben) in einer Warteschlange. Wenn der Swing-Thread fertig ist, entfernt er das Objekt aus der Warteschlange und ruft Ihre Methode run
auf, die wiederum createAndShowGUI
aufruft. Jetzt passiert alles im richtigen Thread.
Während Swing in der Regel eine GUI erstellt, sagen sie nur: "Mach es einfach so, wir erklären später warum". Und ich denke, sie haben Recht, denn die Details sind für einen Anfänger etwas kompliziert und nicht hilfreich. Aber trotzdem:
invokeLater
startet einen Thread, der später eine Runnable
-Klasse ausführt. Die ausführbare Klasse wird ad hoc erstellt, wie von finnw über new Runnable { [..] }
erwähnt, und muss eine Methode public void run()
gemäß der Schnittstelle Runnable
angeben. In diesem Fall wird nur die Methode createAndShowGUI
ausgeführt.
Dieser Code bewirkt, dass eine Funktion (createAndShowGUI ()) in einem anderen Thread aufgerufen wird. Wenn Sie nicht wissen, was ein Thread ist, lesen Sie besser darüber, aber denken Sie darüber als Code, der zur gleichen Zeit ausgeführt wird, zu der anderer Code ausgeführt wird. Der andere Code sind die Zeilen, die diesem Invoke () - Aufruf folgen. Dies ist in Grafik-Apps häufig der Fall, Code wird ausgeführt, um die Grafik zu aktualisieren, während anderer Code auf Benutzeraktionen reagiert. Das heißt, ich habe mir nicht die Mühe gemacht, die Dokumentation über InvokeLater () zu lesen, und habe nicht zu viel Java in meinem Leben geschrieben. Wie 'LumpN' sagte - "so erstellt Swing typischerweise eine GUI".
Das Seltsame (für einen Neuling) ist, dass der Parameter invokeLater () auf anonyme Weise definiert wird - "innerhalb des Codes". Es ist eigentlich eine nette Sache, denn diese Klasse ist so nichts-neues-einfaches. Alle anderen Antworten haben das anonyme Thema erklärt.
so: 1.ja. 2. Sie haben nach dem Grund gefragt und gebeten, nicht zu viele technische Details zu bekommen - aber wie von 'yulkes' gesagt - weil Sie in Java keine Methoden als Parameter übergeben können, also müssen Sie diese Klasse bauen, und es ist schön, sie so zu bauen . 3. Mit dem, was ich in meinem ersten Absatz summierte, können Sie die Dokumentation kurz lesen (einfach den Funktionsnamen bei Google suchen), auch die "Google-Codesuche" kennenlernen.
Wenn Sie invokeLater aufrufen, übergeben Sie ihm eine Instanz vom Typ Runnable. Runnable ist eine Schnittstelle, die nur eine Methode "public void run ()" deklariert. Was in Zeile 1 Ihres Funktionscodes passiert, wird als "anonyme innere Klasse" bezeichnet. Sie erstellen eine Instanz von Runnable, die nur einmal verwendet wird und nicht einmal benannt wird.
InvokeLater wird Ihre Runnable erhalten, und innerhalb wird etwas wie
tun %Vor%Dies bedeutet, dass invokeLater entscheiden wird, wann die run-Methode aufgerufen wird und createAndShowGUI ausgeführt wird.
Da Sie in Java keine Methoden als Parameter übergeben können, die (noch) ausgeführt werden sollen, müssen Sie diese runable-Instanz erstellen.
Tags und Links java concurrency invokelater