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();
});
});