Terminal
De Terminal
component biedt een interactieve terminalemulator die zich gedraagt als een traditionele systeemconsole. Het stelt applicaties in staat om een tekstgebaseerde interface weer te geven en te manipuleren, waarbij tekstuitvoer wordt afgehandeld, gebruikersinvoer wordt ontvangen, controle-sequenties worden geïnterpreteerd en schermbuffers worden onderhouden.
Deze terminal is ontworpen om betrouwbare prestaties te leveren in verschillende gebruiksscenario's, zoals het bouwen van tools voor externe toegang, tekstdashboards, ingebedde opdracht-shells of interactieve debug-console's.
Om de Terminal
component in je app te gebruiken, zorg ervoor dat je de volgende afhankelijkheid in je pom.xml opneemt.
<dependency>
<groupId>com.webforj</groupId>
<artifactId>webforj-terminal</artifactId>
</dependency>
Toon code
- Java
Hoe het werkt
De terminal beheert een grid van tekstcellen, verwerkt binnenkomende karakterstromen en reageert op gebruikersacties zoals typen of tekst selecteren. Het interpreteert automatisch controlekarakters en escape-sequenties voor cursorbeweging, kleurveranderingen en schermwissen.
De kernfunctionaliteiten omvatten:
- Gegevensinvoer: Schrijven van gegevens naar de terminal werkt het scherm bij en verwerkt zowel tekst als controle-sequenties.
- Gegevensuitvoer: Vangt gebruikers toetsaanslagen en geeft deze door als gestructureerde gebeurtenissen.
- Schermbeheer: Beheert een scrollbare geschiedenisbuffer en de huidige schermstatus.
- Cursorbeheer: Volgt de cursorpositie voor tekstinvoer en reacties op controle-sequenties.
De terminal is stateful, wat betekent dat het correct multibyte-tekens reconstrueert en continuïteit behoudt over gefragmenteerde invoer.
Gegevens naar de terminal verzenden
Gegevens worden naar de terminal gestuurd via de write
en writeln
methoden:
write(Object data)
: Stuurt gegevens naar de terminalstroom.writeln(Object data)
: Stuurt gegevens gevolgd door een nieuwe regel.
De terminal verwerkt alle binnenkomende gegevens als UTF-16 strings. Het verwerkt automatisch multibyte-tekens, zelfs wanneer de invoer in gefragmenteerde stukken arriveert.
Voorbeeld
terminal.write("echo Hello World\n");
terminal.writeln("Klaar.");
Je kunt ook een callback toevoegen die wordt uitgevoerd zodra het gegevenspakket is verwerkt:
terminal.write("Langere opdrachtuitvoer", e -> {
System.out.println("Gegevens verwerkt.");
});
Ontvangen van gebruikersinvoer
De terminal vangt door de gebruiker gegenereerde invoer via twee gebeurtenissen:
- Gegevensgebeurtenis (
onData
): Vindt plaats wanneer tekstinvoer gebeurt, waarbij Unicode-tekens worden verzonden. - Toetsgebeurtenis (
onKey
): Vindt plaats voor elke toetsaanslag, inclusief informatie over toetscodes en modifiers zoals Ctrl of Alt.
Deze gebeurtenissen kunnen worden gebruikt om gebruikersinvoer naar een backend door te geven, UI-elementen bij te werken of aangepaste acties te activeren.
Voorbeeld
terminal.onData(event -> {
String userInput = event.getValue();
backend.send(userInput);
});
terminal.onKey(event -> {
if (event.isControlKey() && "C".equals(event.getKey())) {
backend.send("SIGINT");
}
});
Alle door de terminal gevangen gebruikersinvoer (zoals van onData
gebeurtenissen) wordt uitgezonden als UTF-16 strings.
Als je backend een andere codering verwacht (zoals UTF-8 bytes), moet je de gegevens handmatig transcodereren.
Behandelen van grote gegevensstromen
Aangezien de terminal niet in staat is om onbeperkte invoer onmiddellijk weer te geven, behoudt het een interne invoerbuffer. Als deze buffer te groot wordt (standaard ongeveer 50MB
), kunnen nieuwe binnenkomende gegevens worden verworpen om de systeemprestaties te beschermen.
Om snel gegevensbronnen goed te beheren, moet je flow control implementeren.
Basisflow control voorbeeld
Pauzeer je backend totdat de terminal klaar is met het verwerken van een gegevenspakket:
pty.onData(chunk -> {
pty.pause();
terminal.write(chunk, result -> {
pty.resume();
});
});
Watermark flow control voorbeeld
Voor efficiëntere controle, gebruik hoge/lage watermerken:
int HIGH_WATERMARK = 100_000;
int LOW_WATERMARK = 10_000;
int bufferedBytes = 0;
pty.onData(chunk -> {
bufferedBytes += chunk.length;
terminal.write(chunk, e -> {
bufferedBytes -= chunk.length;
if (bufferedBytes < LOW_WATERMARK) {
pty.resume();
}
});
if (bufferedBytes > HIGH_WATERMARK) {
pty.pause();
}
});
Toon code
- Java
Aanpassing
Terminalopties
De TerminalOptions
klasse stelt je in staat om het gedrag te configureren:
- Cursor knipperen.
- Lettertype-instellingen (familie, grootte, gewicht).
- Scrollback-buffergrootte.
- Regelhoogte en letterafstand.
- Toegankelijkheidsinstellingen (mode voor schermlezers).
Voorbeeld:
TerminalOptions options = new TerminalOptions()
.setCursorBlink(true)
.setFontFamily("Courier New, monospace")
.setFontSize(13)
.setScrollback(5000);
terminal.setOptions(options);
Terminalthema
Je kunt de terminal stylen met behulp van TerminalTheme
, dat het volgende definieert:
- Achtergrond- en voortgronds kleuren.
- Standaard
ANSI
kleurenpalet. - Cursor- en selectieachtergrondkleuren.
Voorbeeld:
TerminalTheme theme = new TerminalTheme();
theme.setBackground("#1e1e1e");
theme.setForeground("#cccccc");
terminal.setTheme(theme);
Toon code
- Java
Ondersteunde sequenties
De terminal ondersteunt een breed scala aan standaard controle-sequenties die worden gebruikt voor cursorbeweging, schermupdates en tekstopmaak.
Herkenbare groepen:
C0
controlecodes (eén-byte 7-bit commando's,\x00
,\x1F
, zoals backspace en line feed)C1
controlecodes (één-byte 8-bit commando's,\x80
,\x9F
)ESC
sequenties (begonnen metESC
(\x1B
), zoals cursor opslaan/herstellen, schermuitlijning)CSI
sequenties (Control Sequence Introducer,ESC [
ofCSI (\x9B)
, voor bewerkingen zoals scrollen, wissen en stijlen)DCS
sequenties (Device Control Strings,ESC P
ofDCS (\x90)
)OSC
sequenties (Operating System Commands,ESC ]
ofOSC (\x9D)
, voor het instellen van venstertitels, hyperlinks en kleuren)
Sommige exotische sequentietypen zoals APC
, PM
en SOS
worden herkend maar stilzwijgend genegeerd.
Aangepaste sequenties kunnen indien nodig worden ondersteund via integraties.