https://github.com/kartoffelchipss/tui4j
A Java library for making TUIs including easy inputs and text formatting
https://github.com/kartoffelchipss/tui4j
formatting forms input java java-tui tui tui4j
Last synced: about 2 months ago
JSON representation
A Java library for making TUIs including easy inputs and text formatting
- Host: GitHub
- URL: https://github.com/kartoffelchipss/tui4j
- Owner: KartoffelChipss
- License: gpl-3.0
- Created: 2025-01-08T17:07:14.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2026-01-21T13:55:40.000Z (6 months ago)
- Last Synced: 2026-01-21T22:49:23.116Z (6 months ago)
- Topics: formatting, forms, input, java, java-tui, tui, tui4j
- Language: Java
- Homepage: https://tui4j.strassburger.org/
- Size: 1.38 MB
- Stars: 3
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# TUI4J

[](https://jitpack.io/#KartoffelChipss/TUI4J)

TUI4J is a Java-based library for creating text-based user interfaces (TUIs).
## Demo

*You can find the code for this demo [here](#example-usage).*
## Features
- Flexible Inputs
- Text Input
- Multiline Text Input
- Number Input
- Boolean Input
- Selection Input
- Date Input
- Enter-To-Continue Input
- Easy text formatting
- Colors
- Flex Layouts (Centering, Justifying, Spacing)
- Tables
- Spinners and Loaders
- Command Line Parsing
- Subcommands
- Options
- Arguments
- Customizable
- Custom Input Prompts
- Custom Input Validators
## Installation
Make sure to replace `0.0.0` with the version you want to use. (You can find the latest version [here](https://jitpack.io/#KartoffelChipss/TUI4J))
### Maven
```xml
org.strassburger
TUI4J
0.0.0
jitpack.io
https://jitpack.io
```
### Gradle
```groovy
dependencies {
implementation 'org.strassburger:TUI4J:0.0.0'
}
repositories {
maven { url 'https://jitpack.io' }
}
```
## API Documentation
The API documentation can be found [here](https://tui4j.strassburger.org).
## Examples
### Formatting and Inputs
```java
package org.example;
import org.strassburger.tui4j.formatting.ansi.AnsiColor;
import org.strassburger.tui4j.formatting.StyledText;
import org.strassburger.tui4j.formatting.layout.FlexJustify;
import org.strassburger.tui4j.formatting.layout.FlexText;
import org.strassburger.tui4j.formatting.layout.Spinner;
import org.strassburger.tui4j.formatting.layout.SpinnerFrames;
import org.strassburger.tui4j.input.*;
import org.strassburger.tui4j.input.validationrules.NumberValidationRules;
import org.strassburger.tui4j.input.validationrules.TextValidationRules;
import org.strassburger.tui4j.input.validationrules.ValidationRule;
import org.strassburger.tui4j.printer.ConsolePrinter;
import org.strassburger.tui4j.printer.Printer;
public class Main {
public static void main(String[] args) {
Printer printer = new ConsolePrinter();
printer.println(" ");
printer.println(new FlexText(StyledText.text("Welcome to the TUI4J example application!").fg(AnsiColor.BLUE).bold()));
printer.println(" ");
String name = new TextInput(printer)
.setPrompt("What is your name? ")
.setInline(true)
.read();
String gender = new SelectInput(printer)
.setPrompt("Select your gender: ")
.addOption("Male", "Male")
.addOption("Female", "Female")
.addOption("Other", "Other")
.setOptionsStyle(StyledText.text(" (%num%) ").fg(AnsiColor.CYAN).append("%label%"))
.read();
String email = new TextInput(printer)
.setPrompt("What is your email address?")
.addValidationRule(
new ValidationRule() {
@Override
public boolean validate(String s) {
return s.contains("@") && s.contains(".");
}
@Override
public StyledText getErrorMessage() {
return StyledText.text("Email address must contain '@' and '.'").fg(AnsiColor.RED);
}
}
)
.read();
String about = new MultilineTextInput(printer)
.setPrompt("Tell me about yourself: ")
.addValidationRule(TextValidationRules.minLength(30))
.read();
int age = new IntegerInput(printer)
.setPrompt("How old are you? ")
.addValidationRule(NumberValidationRules.greaterThan(0))
.addValidationRule(NumberValidationRules.lessThan(150))
.read();
double height = new DoubleInput(printer)
.setPrompt("How tall are you? ")
.addValidationRule(NumberValidationRules.greaterThan(0.0))
.addValidationRule(NumberValidationRules.lessThan(3.0))
.read();
printer.println(" ");
printer.println(StyledText.text("Your Inputs:").fg(AnsiColor.BRIGHT_WHITE).bold());
printer.println(new FlexText()
.addPart(StyledText.text("Name ").fg(AnsiColor.BRIGHT_WHITE))
.addPart(StyledText.text(" " + name).fg(AnsiColor.BRIGHT_WHITE))
.setJustify(FlexJustify.SPACE_BETWEEN)
.setSeparatorChar(StyledText.text(".").fg(AnsiColor.BRIGHT_BLACK))
);
printer.println(FlexText.keyValue("Email ", " " + email));
printer.println(FlexText.keyValue("Age ", " " + age));
printer.println(FlexText.keyValue("Height (m) ", " " + height));
printer.println(FlexText.keyValue("Gender ", " " + gender));
printer.println(" ");
boolean shouldContinue = new BooleanInput(printer)
.setPrompt("Do you want to continue? (y/n)")
.read();
if (shouldContinue) {
printer.println("Continuing...");
Spinner spinner = new Spinner()
.setMessage(StyledText.text("Loading some stuff..."))
.setSpinnerColor(AnsiColor.CYAN)
.setSpinnerFrames(SpinnerFrames.SYNTHWAVE)
.setSpeedMs(100);
printer.print(spinner);
for (int i = 0; i < 50; i++) {
Thread.sleep(100);
spinner.setMessage(StyledText.text("Loading some stuff... " + (i + 1) * 2 + "%"));
}
spinner.stop(StyledText.text("✔ Loading complete!").fg(AnsiColor.GREEN).bold());
} else {
printer.println("Exiting...");
}
}
}
```
### Commands
```java
import org.strassburger.tui4j.command.Argument;
import org.strassburger.tui4j.command.Command;
import org.strassburger.tui4j.command.Option;
import org.strassburger.tui4j.command.exceptions.CommandException;
import org.strassburger.tui4j.formatting.layout.*;
import org.strassburger.tui4j.input.*;
public class Main {
public static void main(String[] args) {
String[] testArgs = "farewell franky".split(" ");
System.out.println("Executing with args: " + String.join(" ", testArgs));
Option nameOption = Option.str("name", "n", "World");
Argument nameArgument = Argument.str("name", true);
Command command = Command.root()
.addSubCommand(
Command.named("greet")
.addOption(nameOption)
.setHandler(context -> {
String name = context.getOptionValue(nameOption);
System.out.println("Hello, " + name + "!");
}),
Command.named("farewell")
.addArgument(nameArgument)
.setHandler(context -> {
String name = context.getArgumentValue(nameArgument);
System.out.println("Goodbye, " + name + "!");
})
);
try {
command.execute(testArgs);
} catch (CommandException e) {
System.err.println("Error: " + e.getMessage());
}
}
}
```
### Table
```java
import org.strassburger.tui4j.formatting.StyledText;
import org.strassburger.tui4j.formatting.ansi.AnsiColor;
import org.strassburger.tui4j.formatting.layout.table.Table;
import org.strassburger.tui4j.formatting.layout.table.styles.ColumnAlign;
import org.strassburger.tui4j.formatting.layout.table.styles.TableStyles;
import org.strassburger.tui4j.printer.ConsolePrinter;
import org.strassburger.tui4j.printer.Printer;
import java.util.List;
public class Main {
public static void main(String[] args) {
Printer printer = new ConsolePrinter();
List headers = List.of(
StyledText.text("Name").fg(AnsiColor.BRIGHT_WHITE).bold(),
StyledText.text("Age").fg(AnsiColor.BRIGHT_WHITE).bold(),
StyledText.text("City").fg(AnsiColor.BRIGHT_WHITE).bold()
);
List row1 = List.of(
StyledText.text("Alice").fg(AnsiColor.CYAN),
StyledText.text("30").fg(AnsiColor.GREEN),
StyledText.text("New York").fg(AnsiColor.MAGENTA)
);
List row2 = List.of(
StyledText.text("Bob").fg(AnsiColor.CYAN),
StyledText.text("25").fg(AnsiColor.GREEN),
StyledText.text("Los Angeles").fg(AnsiColor.MAGENTA)
);
List row3 = List.of(
StyledText.text("Charlie").fg(AnsiColor.CYAN),
StyledText.text("35").fg(AnsiColor.GREEN),
StyledText.text("Chicago").fg(AnsiColor.MAGENTA)
);
Table table = new Table()
.setStyle(TableStyles.UNICODE_BOX.withBorderColor(AnsiColor.BRIGHT_BLACK))
.setHasHeader(true)
.setColumnGrow(0, 1)
.setColumnAlignment(0, ColumnAlign.START)
.setColumnAlignment(1, ColumnAlign.CENTER)
.setColumnAlignment(2, ColumnAlign.END)
.addRow(headers)
.addRow(row1)
.addRow(row2)
.addRow(row3);
printer.println(table);
}
}
```
## License
This project is licensed under the GNU General Public License v3.0 - see the [LICENSE](https://github.com/KartoffelChipss/TUI4J/blob/main/LICENSE) file for details.