Terminal
De Terminal component is een interactieve terminalemulator die zich gedraagt als een traditionele systeemconsole. Het behandelt tekstuitvoer, gebruikersinvoer, controle-sequenties en schermbuffers, waardoor het geschikt is voor het bouwen van externe toegangshulpmiddelen, tekstdashboards, ingebedde opdracht-shells of debug-consoles.
Een terminal maken
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>
Het volgende voorbeeld bouwt een interactieve opdracht-shell met getypte opdrachten, geschiedenisnavigatie en aangepaste uitvoer.
Toon Code
- Java
Hoe het werkt
De terminal beheert een rooster van tekstcellen, verwerkt binnenkomende tekenstromen en reageert op gebruikersacties zoals typen of tekstselectie. Het interpreteert automatisch controle-tekens en escape-sequenties voor cursorbeweging, kleurveranderingen en schermwissing.
De kernfunctionaliteiten omvatten:
- Gegevensinvoer: Het schrijven van gegevens naar de terminal werkt het scherm bij, waarbij zowel tekst als controle-sequenties worden behandeld.
- Gegevensuitvoer: Vangt gebruikerstoetsen en geeft ze als gestructureerde gebeurtenissen af.
- Schermbeheer: Onderhoudt een scrollbare geschiedenisbuffer en de huidige schermstatus.
- Cursorbeheer: Houdt de cursorpositie bij voor tekstinvoer en reacties op controle-sequenties.
De terminal is stateful, wat betekent dat het correct meervoudige bytesymbolen reconstrueert en continuïteit behoudt over gefragmenteerde invoer.
Gegevens naar de terminal verzenden
Gegevens worden naar de terminal gestuurd met de write en writeln methoden:
write(Object data): Stuur gegevens in de terminalstroom.writeln(Object data): Stuur gegevens gevolgd door een nieuwe regel.
De terminal verwerkt alle binnenkomende gegevens als UTF-16 strings. Het behandelt automatisch meervoudige bytesymbolen, zelfs wanneer invoer in gefragmenteerde stukjes 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("Lang opdrachtoutput", e -> {
System.out.println("Gegevens verwerkt.");
});
Ontvangen van gebruikersinvoer
De terminal vangt gebruikersgegenereerde invoer via twee gebeurtenissen:
- Gegevensgebeurtenis (
onData): Wordt geactiveerd wanneer er tekstinvoer plaatsvindt, verstuurt Unicode-tekens. - Toetsgebeurtenis (
onKey): Wordt geactiveerd 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 sturen, UI-elementen bij te werken of aangepaste acties te triggeren.
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 gebruikersinvoer die door de terminal wordt vastgelegd (zoals vanuit onData gebeurtenissen) wordt afgegeven als UTF-16 strings.
Als je backend een andere codering verwacht (zoals UTF-8 bytes), moet je de gegevens handmatig transcoderen.
Omgaan met grote gegevensstromen
Omdat de terminal niet onmiddellijk onbeperkte invoer kan weergeven, onderhoudt het een interne invoerbuffer. Als deze buffer te groot wordt (standaard rond de 50MB), kunnen nieuwe binnenkomende gegevens worden verworpen om de systeemprestaties te beschermen.
Om snel gegevensbronnen goed te beheren, moet je flowcontrole implementeren.
Basisflowcontrolevoorbeeld
Pauzeer je backend totdat de terminal een gegevenspakket heeft verwerkt:
pty.onData(chunk -> {
pty.pause();
terminal.write(chunk, result -> {
pty.resume();
});
});
Watermerk-flowcontrolevoorbeeld
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
Terminal opties
De TerminalOptions klasse stelt je in staat om het gedrag te configureren:
- Cursor knipperen.
- Lettertype-instellingen (familie, grootte, gewicht).
- Scrollback buffer grootte.
- Regelhoogte en letterafstand.
- Toegankelijkheidsinstellingen (schermlezer-modus).
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 TerminalTheme, die het volgende definieert:
- Achtergrond- en letterkleur.
- Standaard
ANSIkleurenpalet. - Cursor- en selecties achtergrondkleuren.
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 van standaard controle-sequenties die worden gebruikt voor cursorbeweging, schermupdates en tekstopmaak.
Herkenbare groepen:
C0controlecodes (één-byte 7-bit opdrachten,\x00,\x1F, zoals backspace en line feed)C1controlecodes (één-byte 8-bit opdrachten,\x80,\x9F)ESCsequenties (begint metESC(\x1B), zoals het opslaan/herstellen van de cursor, schermuitlijning)CSIsequenties (Control Sequence Introducer,ESC [ofCSI (\x9B), voor operaties zoals scrollen, wissen en stijlen)DCSsequenties (Device Control Strings,ESC PofDCS (\x90))OSCsequenties (Operating System Commands,ESC ]ofOSC (\x9D), voor het instellen van windowtitel, hyperlinks en kleuren)
Sommige exotische sequentietypen zoals APC, PM en SOS worden herkend maar stilzwijgend genegeerd.
Aangepaste sequenties kunnen worden ondersteund via integraties indien nodig.