Creare interfacce testuali in Java 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).
Vi propongo uno dei molteplici esempi che ci sono sul canale di GitHub:
import com.googlecode.lanterna.TerminalSize;
import com.googlecode.lanterna.TextColor;
import com.googlecode.lanterna.gui2.*;
import com.googlecode.lanterna.screen.Screen;
import com.googlecode.lanterna.screen.TerminalScreen;
import com.googlecode.lanterna.terminal.DefaultTerminalFactory;
import com.googlecode.lanterna.terminal.Terminal;
import java.io.IOException;
import java.util.Arrays;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
try {
Terminal terminal = new DefaultTerminalFactory().createTerminal();
Screen screen = new TerminalScreen(terminal);
screen.startScreen();
Panel panel = new Panel();
panel.setLayoutManager(new GridLayout(2));
Label lblOutput = new Label("");
panel.addComponent(new Label("Num 1"));
TextBox txtNum1 = new TextBox().setValidationPattern(
Pattern.compile("[0-9]*"))
.addTo(panel);
panel.addComponent(new Label("Num 2"));
TextBox txtNum2 = new TextBox().setValidationPattern(
Pattern.compile("[0-9]*"))
.addTo(panel);
panel.addComponent(new EmptySpace(new TerminalSize(0, 0)));
new Button("Fai la somma:", () -> {
int num1 = Integer.parseInt(txtNum1.getText());
int num2 = Integer.parseInt(txtNum2.getText());
lblOutput.setText(Integer.toString(num1 + num2));
}).addTo(panel);
panel.addComponent(new EmptySpace(new TerminalSize(0, 0)));
panel.addComponent(lblOutput);
BasicWindow window = new BasicWindow();
window.setHints(Arrays.asList(Window.Hint.CENTERED));
window.setComponent(panel);
MultiWindowTextGUI gui = new MultiWindowTextGUI(screen,
new DefaultWindowManager(),
new EmptySpace(TextColor.ANSI.BLUE));
gui.addWindowAndWait(window);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
Come potete vedere, qua si parla di componenti "grafici" veri e propri.
In questo esempio abbiamo inserito due campi di testo, nei quali è possibile scrivere solo numeri (le lettere non vengono accettate).
Al click sul bottone, viene visualizzata la somma dei due numeri.
Se usate Maven, basta aggiungere questa dipendenza:
<dependency>
<groupId>com.googlecode.lanterna</groupId>
<artifactId>lanterna</artifactId>
<version>3.0.1</version>
</dependency>
Enjoy!
java maven lanterna curses
Commentami!