Kann mir jemand diese Javax-Swing-Methode erklären?

7

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:

  1. Definiert "public void run" eine neue Methode? Wenn dies der Fall ist, warum wird es in einer anderen Methode definiert (siehe "größerer Code" als Referenz)?
  2. Wenn "public void run" eine neue Methode definiert, was ist ein Grund, eine Methode zu definieren, die nur eine Codezeile enthält (createAndShowGUI)?
  3. Was macht "invokeLater"? Das ist die komplizierteste Frage für mich.

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!

    
Roman 22.10.2013, 06:59
quelle

5 Antworten

11

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.

    
danben 30.01.2010 13:31
quelle
6

Es ist eine anonyme innere Klasse .

Sie definieren drei Dinge:

  • Eine neue Klasse
  • Eine Methode namens run innerhalb dieser Klasse
  • Eine neue Instanz 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.

    
finnw 30.01.2010 13:35
quelle
2

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.

    
LumpN 30.01.2010 13:36
quelle
1

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.

    
Hanan 30.01.2010 13:51
quelle
0

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.

    
yulkes 30.01.2010 13:32
quelle

Tags und Links