Creare TUI in Kotlin con Lanterna

Mattepuffo's logo
Creare TUI in Kotlin con Lanterna

Creare TUI in Kotlin con Lanterna

Lanterna è una libreria per Java che ci permette di creare delle interfacce testuali simili a quelle create con curses.

Ma questa a descrizione è molto restrittiva, in quanto Lanterna è in grado ci creare anche dei layout complessi, con finestre, pannelli, file dialog, ecc.

Inoltre, è anche possibile usare le stesse classi di Swing (ma non è obbligatorio).

Oggi vediamo come usarla in Kotlin.

Se usate Maven:

        <dependency>
            <groupId>com.googlecode.lanterna</groupId>
            <artifactId>lanterna</artifactId>
            <version>3.1.1</version>
        </dependency>

Qui sotto il codice di un vecchio esempio che avevamo visto in Java riportato in Kotlin:

import com.googlecode.lanterna.TerminalSize
import com.googlecode.lanterna.TextColor
import com.googlecode.lanterna.gui2.*
import com.googlecode.lanterna.gui2.Window.Hint
import com.googlecode.lanterna.screen.Screen
import com.googlecode.lanterna.screen.TerminalScreen
import com.googlecode.lanterna.terminal.DefaultTerminalFactory
import java.io.IOException
import java.util.*
import java.util.regex.Pattern


fun main(args: Array<String>) {

    try {
        val terminal = DefaultTerminalFactory().createTerminal()
        val screen: Screen = TerminalScreen(terminal)
        screen.startScreen()

        val panel = Panel()
        panel.layoutManager = GridLayout(2)

        val lblOutput = Label("")
        panel.addComponent(Label("Num 1"))

        val txtNum1 = TextBox().setValidationPattern(
            Pattern.compile("[0-9]*")
        ).addTo(panel)
        panel.addComponent(Label("Num 2"))

        val txtNum2 = TextBox().setValidationPattern(
            Pattern.compile("[0-9]*")
        ).addTo(panel)
        panel.addComponent(EmptySpace(TerminalSize(0, 0)))

        Button("Fai la somma:") {
            val num1 = txtNum1.text.toInt()
            val num2 = txtNum2.text.toInt()
            lblOutput.text = Integer.toString(num1 + num2)
        }.addTo(panel)
        panel.addComponent(EmptySpace(TerminalSize(0, 0)))
        panel.addComponent(lblOutput)

        val window = BasicWindow()
        window.setHints(Arrays.asList(Hint.CENTERED))
        window.component = panel

        val gui = MultiWindowTextGUI(
            screen,
            DefaultWindowManager(),
            EmptySpace(TextColor.ANSI.BLUE)
        )
        gui.addWindowAndWait(window)
    } catch (ex: IOException) {
        println(ex.message)
    }

}

Enjoy!


Condividi

Commentami!