Hallo Welt mit Kotlin und JavaFX

Einführung

Java Reading Group BOF veranstaltet seit Januar 2018 eine Lesegruppe "Kotlin in Action".

Wenn Sie Kotlin mit aller Kraft lernen möchten, habe ich beschlossen, die GUI neu zu schreiben, damit die Hello World-Nachricht in dem zuvor erstellten JavaFX mit Kotlin fließt, weil ich etwas machen wollte.

Dieser Artikel soll den obigen Java-Code durch Kotlin ersetzen. Weitere Informationen zu JavaFX finden Sie im obigen Blog.

Speichern Sie den erstellten Code im folgenden Repository (Repository-Viewer-URL)

http://www.torutk.com/projects/swe/repository/revisions/master/show/learn/kotlin/javafx/MessageBoard

Umwelt vorbereiten

Wenn Sie die Probleme beim Erstellen einer Umgebung vermeiden und viel Codierungsunterstützung wie Code-Vervollständigung nutzen möchten, ist die JetBrains-Entwicklungsumgebung IntelliJ IDEA, die Kotlin entwickelt, oder Android Studio, das auf IntelliJ IDEA basiert, fast die richtige Wahl. ist.

In dem Artikel "Hallo Welt, die mit JavaFX fließt" habe ich das Erstellen in der Java-Befehlszeilenumgebung vorgestellt. Kenntnisse der Java-Ausführungsumgebung sind nützlich und sollten bekannt sein. Im Fall von Kotlin ist die Vorbereitung der Kotlin-Umgebung zusätzlich zur Java-Umgebung jedoch sehr aufwändig, und ich habe nicht viel Gelegenheit, dieses Wissen zu nutzen. Daher werde ich dieses Mal die IDE von Anfang an verwenden.

IntelliJ IDEA Community Edition IntelliJ IDEA ist ein Produkt für eine kommerzielle Entwicklungsumgebung, die Community Edition wird jedoch kostenlos zur Verfügung gestellt. Die Entwicklungsumgebung von Kotlin ist in der Community Edition enthalten, daher werden wir sie dieses Mal verwenden.

Ich denke, dass es in Android Studio (auch von Google kostenlos zur Verfügung gestellt) auf fast die gleiche Weise verwendet werden kann, aber ich habe es nicht überprüft.

Japanische Lokalisierung von IntelliJ IDEA (wenn Sie möchten)

Pleiades, ein bekanntes japanisches Lokalisierungstool in Eclipse, unterstützt auch die japanische Lokalisierung von IntelliJ IDEA. Als nächstes schreibe ich eine kleine Einführungsmethode.

IntelliJ IDEA-Schriftarten in einer japanischen Windows-Umgebung (wenn Sie möchten)

In der japanischen Windows-Umgebung sind europäische Schriftarten wunderschön, aber japanische Schriftarten sind MS Gothic und gezackt. Als nächstes schreibe ich eine Einstellung, um die Schrift ein wenig zu bereinigen.

Erstellen Sie ein Kotlin-Projekt

Erstellen Sie in IntelliJ IDEA ein Projekt für ein fließendes Hello World-Programm.

Erstellen Sie eine Kotlin-Quelldatei

MessageBoard.kt


class MessageBoard {
}

Von hier aus werden wir JavaFX aufrufen und eine fließende Hallo-Welt erstellen.

Hallo Weltprogrammierung mit Kotlin und JavaFX

Rufen Sie JavaFX mit Kotlin auf und programmieren Sie die GUI der fließenden Hello World-Nachricht.

JavaFX-Anwendungsklasse erben

JavaFX erbt die Anwendungsklasse und bereitet eine Klasse vor, die als Einstiegspunkt für die JavaFX-Verarbeitung dient.

Wenn Sie mit dem Wissen eines Java-Programmierers fortfahren, der Kotlin gebissen hat ...

Lassen Sie die von der Anwendung erstellte Klasse die JavaFX-Anwendungsklasse erben.

MessageBoard.kt


class MessageBoard : Application {
}

In Kotlin wird die Vererbung durch ein Doppelpunktsymbol angegeben. Hier muss die Anwendungsklasse importiert werden, sodass im IntelliJ IDEA-Code die folgende Popup-Meldung angezeigt wird.

image.png

Folgen Sie der Popup-Meldung, drücken Sie Alt + Eingabetaste und wählen Sie javafx.application.Application aus der Kandidatenliste aus.

image.png

Eine Importanweisung wird generiert.

MessageBoard.kt


import javafx.application.Application

class MessageBoard : Application {
}

Es ist jedoch immer noch unvollständig und befindet sich in einem Kompilierungsfehlerzustand. Der nächste Bildschirm zeigt die Situation, in der der Fehlerinhalt angezeigt wird.

image.png

Sie müssen eine Startmethode definieren. Generieren Sie im Menü Code> Methode implementieren den abstrakten Methodenstart der Anwendungsklasse.

image.png

Der generierte Code lautet:

MessageBoard.kt


import javafx.application.Application
import javafx.stage.Stage

class MessageBoard : Application {
    override fun start(primaryStage: Stage?) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}

Es gibt jedoch immer noch Fehler. Unterhalb der Anwendung wird eine rote Wellenlinie gezeichnet. Wenn Sie den Cursor auf Anwendung bewegen, wird der Fehlerinhalt wie folgt angezeigt.

image.png

Die Meldung lautet "Dieser Typ hat einen Konstruktor und muss daher hier initialisiert werden". Was ist das? Details werden im nächsten Abschnitt beschrieben.

Beim Erben in einer Klasse ohne Konstruktor

„Kotlin in Aktion“ auf Seite 106 in Abschnitt 4.2.1

open class Button ← Erzeugt einen Standardkonstruktor ohne Argumente

Wenn Sie von der Button-Klasse erben und keinen Konstruktor haben, müssen Sie den Konstruktor dieser Superklasse explizit aufrufen, auch wenn der Konstruktor der Superklasse keine Argumente hat.

class RadioButton : Button()

Diesmal definieren wir also keinen Konstruktor in der MessageBoard-Klasse. Die richtige Antwort besteht darin, Klammern in die geerbte Oberklasse zu setzen.

MessageBoard.kt


import javafx.application.Application
import javafx.stage.Stage

class MessageBoard : Application() {
    override fun start(primaryStage: Stage?) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}

Jetzt haben Sie den Code mit dem Kompilierungsfehler entfernt.

Wo die Hauptmethode definiert ist

Aber ich kann es immer noch nicht tun. Definieren Sie die Hauptmethode, die der Einstiegspunkt für das Programm ist. In Kotlin wird die Hauptmethode nicht wie in Java als statische Methode in der Klasse definiert, sondern als Funktion der obersten Ebene.

MessageBoard.kt


class MessageBoard : Application() {...}

fun main(args: Array<String>) {
    //Schreiben Sie hier den Code, der die Startmethode der Application-Klasse aufruft
}

Kotlin verfügt nicht über statische Methoden / statische Felder, es ist jedoch möglich, auf statische Methoden / statische Felder zuzugreifen, die in Java-Klassen definiert sind, und ihre aufrufenden Ausdrücke sind dieselben wie in Java.

Die Startmethode der JavaFX-Anwendungsklasse hat unterschiedliche Argumente, wenn sie innerhalb einer Unterklasse der Anwendungsklasse aufgerufen wird und wenn sie von außerhalb dieser Unterklasse aufgerufen wird. Dieses Mal ruft Java die Startmethode des folgenden Formats auf, da es von außerhalb der Unterklasse stammt.

public static void launch(
        Class<? extends Application> appClass,
        String... args
)

Hier gibt es zwei Herausforderungen:

Die erste besteht darin, die Klassenreferenz (KClass-Typ) mit :: class für die Klasse abzurufen und dann die erweiterte Eigenschaft Java des KClass-Typs aufzurufen und abzurufen.

Der zweite verwendet den Spread-Operator, um das Array zu erweitern.

fun main(args: Array<String>) {
    Application.launch(MessageBoard::class.java, *args)
}

Informationen zum Festlegen von Argumenten mit variabler Länge mit dem Spread-Operator finden Sie unter "Kotlin in Aktion", Abschnitt 3.4.2 (S. 76).

Kotlin muss den Inhalt des Arrays explizit abrufen, damit alle Elemente des Arrays unabhängige Argumente für die aufrufende Funktion sind. Technisch wird diese Funktion mit dem Spread-Operator aufgerufen, aber es ist eigentlich so einfach, ein * vor das entsprechende Argument zu setzen.

fun main(args: Array<String>) {
    val list = listOf("args: ", *args)← Der Spread-Operator ruft den Inhalt eines Arrays ab
    print(list)
}

Es gibt.

Damit ist die minimale Implementierung abgeschlossen. Lassen Sie es uns ausführen (obwohl das Fenster noch nicht angezeigt wird).

Einstellungen für die Ausführung

Wenn Sie die Hauptfunktion auf der obersten Ebene der Datei definieren, wird das folgende Symbol links in der Zeile hinzugefügt.

image.png

Klicken Sie auf dieses Symbol, um Optionen zum Ausführen, Debuggen und Ausführen der Abdeckung anzuzeigen. Wählen Sie Ausführen.

image.png

Der Code wird dann erstellt und ausgeführt. Bei der erstmaligen Ausführung über dieses Symbol wird [Ausführen] über das Menü [Ausführen] und der Klassenname (Dateiname) der Datei, in der die Hauptfunktion definiert ist, in der Liste über das Menü [Ausführen]> [Startkonfiguration ausführen] aktiviert. Eine Klasse mit dem Namen Kt hinzugefügt) wird hinzugefügt und kann ausgewählt werden.

image.png

Bei der Ausführung wird der Vorlagenimplementierungscode TODO der Startmethode aufgerufen, um eine Ausnahme anzuzeigen.

"C:\Program Files\Java\jdk-9\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.3.1\lib\idea_rt.jar=52509:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.3.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\work\java\repos\swe.primus\learn\kotlin\javafx\MessageBoard\out\production\MessageBoard;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.3.1\plugins\Kotlin\kotlinc\lib\kotlin-stdlib.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.3.1\plugins\Kotlin\kotlinc\lib\kotlin-reflect.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.3.1\plugins\Kotlin\kotlinc\lib\kotlin-test.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.3.1\plugins\Kotlin\kotlinc\lib\kotlin-stdlib-jdk7.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.3.1\plugins\Kotlin\kotlinc\lib\kotlin-stdlib-jdk8.jar" MessageBoardKt
Exception in Application start method
Exception in thread "main" Exception in thread "Thread-2" java.lang.RuntimeException: Exception in Application start method
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:973)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:198)
	at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: kotlin.NotImplementedError: An operation is not implemented: not implemented
	at MessageBoard.start(MessageBoard.kt:6)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:919)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(PlatformImpl.java:449)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417)
	at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
	... 1 more
java.lang.IncompatibleClassChangeError

Fenster der obersten Ebene anzeigen

Es ist endlich Zeit zu implementieren. Beschreiben Sie zunächst die Visualisierung der Bühne mit der Startmethode. Als Java-Programmierer würde ich Folgendes codieren, was ein Kompilierungsfehler ist. Der Punkt ist, dass der Argumenttyp Stage ist und am Ende ein hat.

MessageBoard.kt


    override fun start(primaryStage: Stage?) {
        primaryStage.show()
    }

Der Kompilierungsfehler wird im folgenden Popup angezeigt.

image.png

Die Argumenttypen der Startmethode sind Stage? Type und nullable type. Daher muss vor dem Aufrufen der Methode nach null gesucht oder die Methode nach null aufgerufen werden.

Wenn hier das Argument primaryStage null wird, wird nichts unternommen, sodass die show-Methode mit dem Operator für sichere Aufrufe (?.) Aufgerufen wird.

MessageBoard.kt


    override fun start(primaryStage: Stage?) {
        primaryStage?.show()
    }

In "Kotlin In Action", Abschnitt 6.1.3 (S.181)

Der Safe-Call-Betreiber? Dies ist eine Kombination aus Nullprüfung und Methodenaufruf in einem einzelnen Operator. (Weggelassen) Wenn der Wert, bei dem Sie versuchen, eine Methode aufzurufen, nicht null ist, wird der Methodenaufruf normal ausgeführt. Wenn der Wert null ist, wird der Aufruf übersprungen und stattdessen wird null als Wert verwendet.

Es gibt.

Beim Ausführen wird ein leeres Fenster angezeigt.

image.png

Platzierung von Nachrichten

Zeigen Sie den Text in einem leeren Fenster an.

Generieren Sie zunächst einen Text, in dem die Zeichen angezeigt werden. Der Unterschied zu Java besteht darin, dass es keinen neuen Operator gibt und der Variablentyp mit einem unveränderlichen Wert deklariert wird.

MessageBoard.kt


val message = Text("Hello, world. This is JavaFX from Kotlin.")

Erstellen Sie eine Gruppe, um JavaFX-Knoten zu gruppieren. Instanzerstellung und Variablentypen ähneln dem obigen Text. Als nächstes wird das, was in Java setLayoutY (50d) genannt wurde, zu einer Zuweisungsanweisung für eine Eigenschaft in Kotlin. Außerdem hat Kotlin in Java kein D (oder d), das ein doppelt numerisches Literal angibt. Geben Sie daher .0 nach dem Dezimalpunkt an. Übrigens, wenn Sie 50 und ein Ganzzahlliteral (Int-Typ) schreiben, tritt ein Fehler auf, wenn die Typen unterschiedlich sind.

MessageBoard.kt


val group = Group(message)
group.layoutY = 50.0

Generiere eine Szene. Bei der Größe (Breite, Höhe) tritt ein Fehler auf, wenn der Typ für Ganzzahlen unterschiedlich ist, sodass die Werte nach dem Dezimalpunkt angegeben werden. In Java wird es mit der setScene-Methode auf primaryStage gesetzt und in Kotlin einer Eigenschaft zugewiesen.

MessageBoard.kt


        val scene = Scene(group, 320.0, 160.0)
        primaryStage?.scene = scene

Die gesamte Startmethode sieht folgendermaßen aus:

MessageBoard.kt


    override fun start(primaryStage: Stage?) {
        val message = Text("Hello, world. This is JavaFX from Kotlin.")
        val group = Group(message)
        group.layoutY = 50.0
        val scene = Scene(group, 320.0, 160.0)
        primaryStage?.scene = scene
        primaryStage?.show()
    }

Ich werde das machen.

image.png

Eine Nachricht schicken

Verwenden Sie die JavaFX-Animation, um den Text von rechts nach links zu verschieben.

Definieren Sie in der Startmethode TranslateTransition für die Animation.

MessageBoard.kt


val messageTransition = TranslateTransition(Duration.seconds(8.0), message)
messageTransition.fromX = 320.0
messageTransition.toX = -320.0
messageTransition.interpolator = Interpolator.LINEAR
messageTransition.cycleCount = TranslateTransition.INDEFINITE

Der Unterschied besteht wiederum darin, dass Sie den neuen Operator nicht benötigen und die set-Methode eine Zuweisung zu einer Eigenschaft ist, sie entspricht jedoch fast dem Java-Code. Rufen Sie am Ende auch play () auf.

MessageBoard.kt


messageTransition.play()

Bei der Ausführung wird die fließende Hallo-Welt angezeigt. Das Folgende ist ein animiertes GIF des angezeigten Bildschirms mit 10 fps (das Verrückte ist das Problem der FPS bei der Erstellung eines animierten GIF, JavaFX zeichnet mit maximal 60 fps).

HelloWorld.gif

Im obigen Code ist die Beschreibung von TranslateTransition für Kotlin redundant (die Zuweisung von Eigenschaften zu lokalen Variablen wird wiederholt angezeigt). Daher wird apply verwendet, um den Umfang der Beschreibung zu verringern. Die gesamte Startmethode nach der Reduktion ist unten dargestellt.

MessageBoard.kt


    override fun start(primaryStage: Stage?) {
        val message = Text("Hello, world. This is JavaFX from Kotlin.")

        val group = Group(message)
        group.layoutY = 80.0

        val scene = Scene(group, 320.0, 160.0)

        primaryStage?.scene = scene
        primaryStage?.show()

        TranslateTransition(Duration.seconds(8.0), message).apply {
            fromX = 320.0
            toX = -320.0
            interpolator = Interpolator.LINEAR
            cycleCount = TranslateTransition.INDEFINITE
        }.play()

    }

Look Anpassungen, Farben und Schriftarten

Stellen Sie abschließend die Farbe und Größe des Nachrichtentextes ein.

MessageBoard.kt


    override fun start(primaryStage: Stage?) {
        val message = Text().apply {
            text = "Hello, world. This is JavaFX from Kotlin."
            fill = Color.DARKMAGENTA
            font = Font.font("Serif", FontWeight.SEMI_BOLD, 32.0)
        }
        val messageWidth = message.layoutBounds.width
        val messageHeight = message.layoutBounds.height

        val group = Group(message)
        group.layoutY = messageHeight * 2

        val scene = Scene(group, messageWidth, messageHeight * 3)

        primaryStage?.scene = scene
        primaryStage?.show()

        TranslateTransition(Duration.seconds(8.0), message).apply {
            fromX = messageWidth
            toX = -messageWidth
            interpolator = Interpolator.LINEAR
            cycleCount = TranslateTransition.INDEFINITE
        }.play()
    }

Ich werde das machen.

HelloWorldColorFont.gif

Verteilung der fließenden Hallo Welt

Dieses Mal ist das Ziel, es in einer ausführbaren JAR zusammenzustellen.

Generieren Sie eine ausführbare JAR mit IntelliJ IDEA

In der NetBeans-IDE wurde beim Erstellen eines Java-Projekts eine JAR-Datei erstellt, die ohne zusätzliche Einstellungen ausgeführt werden konnte.

Nachdem Sie untersucht haben, was IntelliJ IDEA tun sollte, können Sie eine ausführbare JAR-Datei generieren, indem Sie die folgenden Schritte ausführen.

image.png

Welches ist die Hauptklasse in Kotlin?

Sie müssen die Hauptklasse angeben. In Kotlin wird die Hauptfunktion auf der obersten Ebene der Datei geschrieben. Bei der Kompilierung in Java-Bytecode handelt es sich um eine Klasse, die nach dem Dateinamen benannt ist (in der Klasse MessageBoardKt enthalten, wenn die Hauptfunktion auf der obersten Ebene der Datei MessageBoard.kt definiert ist).

Beim Erstellen und Ausführen mit IntelliJ IDEA wird die folgende Klassendatei unter out \ Production \ MessageBoard im Projektverzeichnis generiert.

Untersuchen Sie die in jeder Klassendatei definierten Methoden mit dem Befehl javap des JDK.

D:~> javap MessageBoard
Compiled from "MessageBoard.kt"
public final class MessageBoard extends javafx.application.Application {
  public void start(javafx.stage.Stage);
  public MessageBoard();
}

D:~>javap MessageBoardKt
Compiled from "MessageBoard.kt"
public final class MessageBoardKt {
  public static final void main(java.lang.String[]);
}

Die Klasse mit der Hauptmethode ist MessageBoardKt.class. Geben Sie in der Fortsetzung der vorherigen Klasse die Hauptklasse auf dem nächsten Bildschirm an. Klicken Sie am rechten Ende der Hauptklassenspalte auf […].

image.png

Daraufhin wird der Bildschirm Hauptklasse auswählen angezeigt. Geben Sie auf der Registerkarte Nach Namen suchen einen Teil des Hauptklassennamens (hier "M") ein, da dieser anfänglich leer ist. Dann wird die diesem Namen entsprechende Klasse aufgelistet. Wählen Sie hier also [MessageBoardKt].

image.png

Das Feld für die JAR-Datei aus der Bibliothek ist standardmäßig auf "Ziel-JRA extrahieren" eingestellt. Dies schließt die Klassendateien der Bibliothek zusammen in die ausführbare JAR-Datei ein, wenn eine andere Bibliothek als der Java SE-Standard verwendet wird. [In Ausgabeverzeichnis kopieren und über Manifest verknüpfen] ist der Unterschied zwischen dem Vorbereiten einer Bibliotheksdatei getrennt von der ausführbaren JAR-Datei und dem Schreiben eines Verweises auf die Bibliotheksdatei im Manifest in die ausführbare JAR-Datei.

Dieses Mal behalten wir die Standardeinstellung bei, damit sie ausgeführt werden kann, indem nur eine JAR-Datei verteilt wird. Klicken Sie auf OK, um die unten gezeigte Konfiguration anzuzeigen.

image.png

Wenn Sie [In Projekterstellung einbeziehen] aktivieren, wird bei der Ausführung der Erstellung eine JAR-Datei generiert. Wenn Ihnen die Zeit nicht gefällt, lassen Sie sie deaktiviert und wählen Sie Menü "Erstellen"> "Artefakte erstellen", um eine JAR-Datei zu generieren. Wählen Sie Erstellen / Neu erstellen mit dem Namen der Konfiguration, die Sie gerade erstellt haben.

image.png

Die JAR-Datei wurde im Projektverzeichnis out \ artefaktors \ MessageBoard_jar \ MessageBoard.jar generiert. Die Kapazität beträgt bis zu 3,3 MB. Dies liegt daran, dass es auch die Kotlin-Ausführungsbibliothek enthält.

Wenn Sie diese JAR-Datei unabhängig verteilen, können Sie das von Kotlin erstellte Programm in der Umgebung ausführen, in der JRE enthalten ist.

Erweiterte Version

Wenden Sie die Zerlegungsdeklaration auf die Java-Klasse an

Wenn sich der folgende Code überflüssig anfühlt,

val messageWidth = message.layoutBounds.width
val messageHeight = message.layoutBounds.height

Ich möchte die Zerlegungsdeklaration anwenden

val (messageWidth, messageHeight) = message.layoutBounds

Ich möchte schreiben. Java-Klassen haben jedoch keine definierten Methoden component1 (), component2 (), ... zum Anwenden von Zerlegungsdeklarationen.

Definieren Sie es daher mit einer Erweiterungsmethode.

operator fun Bounds.component1(): Double = width

operator fun Bounds.component2(): Double = height

Dadurch kann die Bounds-Klasse in Zerlegungsdeklarationen verwendet werden.

Dies ist jedoch ein großer Overkill. Es ist "keine Gnade" (es ist unvermeidlich zu bestehen).

Recommended Posts

Hallo Welt mit Kotlin und JavaFX
Hallo Welt mit Kotlin und Tornado FX
Hallo Welt mit Docker und C Sprache
Hallo Welt mit GWT 2.8.2 und Maven
"Hallo Welt!" Mit Kotlin + CLI in 5 Minuten
Hallo Welt mit Micronaut
Vergleiche Hallo Welt! Mit Spring Boot mit Java, Kotlin und Groovy
Hallo Welt mit Spring Boot!
Hallo Welt mit VS Code!
Hallo Welt mit Spring Boot
Hallo Welt mit SpringBoot / Gradle
Hallo Welt, mit Asakusa Framework!
Bis "Hallo Welt" mit Spring Boot
(Intellij) Hallo Welt mit Spring Boot
Hallo Welt mit GlassFish 5.1 + Servlet + JSP
Erstellen Sie PDF mit itext7 ~ HelloWorld ~
Ziehen Sie Dateien mit JavaFX per Drag & Drop
"Hallo Welt" für ImageJ mit Eclipse
Android OS (7.1.2) Build und Hello World
Hallo Welt in Java und Gradle
[Swift] Erstellen Sie ein Projekt mit Xcode (Version 12.1) und zeigen Sie "Hallo Welt!"
Bis Sie Hello World of JavaFX mit VSCode + Gradle ausführen
Hallo Welt mit Eclipse + Spring Boot + Maven
Hallo Welt mit Java Template Engine Thymeleaf
Vergrößern / verkleinern und parallel zu JavaFX Canvas verschieben (Revenge Edition)
Java-Entwicklung mit Codenvy: Hello World! Run
Wie Spring Security mit Hello World funktioniert
(IntelliJ + gradle) Hallo Welt mit Spring Boot
Minimale Java-Umgebungskonstruktion und Hello World
JavaFX und HiDPI
HelloFX mit JavaFX
Lesen Sie "Hallo Welt"
Versuchen Sie, "Hello, World" mit einer Kombination aus verschiedenen Sprachen und Bibliotheken zu schreiben
Java, Hallo Welt!
Java Hallo Welt
Hallo Welt! Mit Spring Boot (Marven + Texteditor)
Hallo Welt mit explosiver Geschwindigkeit mit Spring Initializr! !! !!
Erstellen Sie eine Java-Umgebung und geben Sie Hallo Welt aus [Anfänger]
Führen Sie JSP Hello World mit Tomcat auf Docker aus
Bis Sie Gradle installieren und "Hello World" ausgeben
[Java] Hallo Welt mit Java 14 x Spring Boot 2.3 x JUnit 5 ~
Zeigen Sie eine einfache Hallo Welt mit SpringBoot + IntelliJ
Versuchen Sie, Hallo Welt mit Frühling + Gradle anzuzeigen
Sie können @Param mit Kotlin 1.1 und MyBatis 3.4.1+ eliminieren! !!
Ein einfaches Stein-Papier-Scheren-Spiel mit JavaFX und SceneBuilder
Erste JavaFX ~ Einfache Einführung Hallo weltähnliche GUI-Erstellung ~
Mit Rails + Docker einfach Hallo Welt anzuzeigen
Hallo Welt mit Java Servlet und JSP (Einfacher Start des Webservers mit Maven + Jetty)
Frohe Weihnachten mit JavaFX !!
"Hallo Welt" in Java
Hallo Welt (REST API) mit Apache Camel + Spring Boot 2
JavaFX-Schaltflächen und Beschriftungen
Java lernen (1) -Hallo Welt
Lesen Sie System.out.println ("Hallo Welt")
Schreiben wir Hello World
Hallo Welt in Java
Java-Teil 1-Hallo Welt studieren
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor