Terminal
Terminal-komponentti on interaktiivinen terminaaliemulaattori, joka käyttäytyy kuten perinteinen järjestelmäkonsoli. Se käsittelee tekstilähtöä, käyttäjän syötettä, ohjausmerkkejä ja näyttöpuskuria, mikä tekee siitä sopivan etäyhteystoimintojen, tekstidashbordien, upotettujen komentorivien tai virheenkorjauskonsolien rakentamiseen.
Luodaan terminaali
Käyttääksesi Terminal-komponenttia sovelluksessasi, varmista, että olet lisännyt seuraavan riippuvuuden pom.xml-tiedostoon.
<dependency>
<groupId>com.webforj</groupId>
<artifactId>webforj-terminal</artifactId>
</dependency>
Seuraava esimerkki rakentaa interaktiivisen komentorivin, jossa on kirjoitettuja komentoja, historiaseikkailua ja mukautettua lähtöä.
Näytä koodi
- Java
Kuinka se toimii
Terminaali hallitsee tekstisolujen ruudukkoa, käsittelee saapuvia merkistöitä ja reagoi käyttäjän toimiin, kuten kirjoittamiseen tai tekstin valintaan. Se tulkitsee automaattisesti ohjausmerkkejä ja pakomerkkejä, jotka liittyvät kursorin liikkumiseen, värin muutokseen ja näytön tyhjentämiseen.
Peruskäyttäytyminen sisältää:
- Data Input: Tietojen kirjoittaminen terminaaliin päivittää näyttöä, käsitellen sekä tekstiä että ohjausmerkkejä.
- Data Output: Tallentaa käyttäjän näppäilyt ja lähettää ne rakenteellisina tapahtumina.
- Näytön hallinta: Säilyttää vieritettävän historiaosan ja nykyisen näyttötilan.
- Kursoria käsittely: Seuraa kursorin sijaintia tekstinsyöttöä ja ohjausmerkkejä varten.
Terminaali on tilallinen, mikä tarkoittaa, että se rekonstruoi oikein monibittiset merkit ja ylläpitää jatkuvuutta fragmentoitujen syötteiden välillä.
Tietojen lähettäminen terminaaliin
Tietoja lähetetään terminaaliin write- ja writeln-menetelmien avulla:
write(Object data): Lähettää tietoja terminaalivirtaan.writeln(Object data): Lähettää tietoja uuden rivin kanssa.
Terminaali käsittelee kaikki saapuvat tiedot UTF-16 merkkijonoina. Se käsittelee automaattisesti monibittisiä merkkejä, vaikka syöte saapuu fragmentoituna.
Esimerkki
terminal.write("echo Hello World\n");
terminal.writeln("Ready.");
Voit myös liittää palautteen, joka suoritetaan, kun tietomäärä on käsitelty:
terminal.write("Pitkä komennon lähtö", e -> {
System.out.println("Data käsitelty.");
});
Käyttäjän syötteen vastaanottaminen
Terminaali tallentaa käyttäjän tuottaman sisällön kahden tapahtuman kautta:
- Data Event (
onData): Tulipalo kun tekstisyöttö tapahtuu, lähettäen Unicode-merkkejä. - Key Event (
onKey): Tulipalo jokaisen näppäimen painalluksessa, sisältäen tietoa näppäinkoodista ja modifieroista kuten Ctrl tai Alt.
Näitä tapahtumia voidaan käyttää käyttäjän syötteen välittämiseen taustajärjestelmälle, käyttöliittymäelementtien päivittämiseen tai mukautettujen toimintojen käynnistämiseen.
Esimerkki
terminal.onData(event -> {
String userInput = event.getValue();
backend.send(userInput);
});
terminal.onKey(event -> {
if (event.isControlKey() && "C".equals(event.getKey())) {
backend.send("SIGINT");
}
});
Kaikki terminaalilta vangittu käyttäjän syöte (kuten onData-tapahtumista) lähetetään UTF-16 merkkijonoina.
Jos taustajärjestelmäsi odottaa eri koodisarjaa (kuten UTF-8 tavuina), sinun on muunnettava tiedot käsin.
Suurten tietovirtojen käsittely
Koska terminaali ei voi välittömästi renderöidä rajatonta syötettä, se ylläpitää sisäistä syöttöpuskurointia. Jos tämä puskurikasvaa liian suureksi (oletusarvoisesti noin 50MB), uudet saapuvat tiedot voidaan hylätä järjestelmän suorituskyvyn suojelemiseksi.
Nopeiden tietolähteiden hallitsemiseksi sinun tulisi toteuttaa virranhallinta.
Perusvirranhallintaesimerkki
Pysäytä taustajärjestelmäsi, kunnes terminaali on valmis käsittelemään osan:
pty.onData(chunk -> {
pty.pause();
terminal.write(chunk, result -> {
pty.resume();
});
});
Vesileimana virranhallintaesimerkki
Tehokkaamman hallinnan vuoksi käytä korkea/matala vesileimaa:
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();
}
});
Näytä koodi
- Java
Mukauttaminen
Terminaali vaihtoehdot
TerminalOptions-luokka mahdollistaa käyttäytymisen konfiguroimisen:
- Kursori vilkkuminen.
- Fonttiasetukset (perhe, koko, paino).
- Vierityspuskuri koko.
- Rivikorkeus ja kirjainten väli.
- Esteettömyysasetukset (näytönlukijan tila).
Esimerkki:
TerminalOptions options = new TerminalOptions()
.setCursorBlink(true)
.setFontFamily("Courier New, monospace")
.setFontSize(13)
.setScrollback(5000);
terminal.setOptions(options);
Terminaaliteema
Voit tyylitellä terminaalia käyttäen TerminalTheme, joka määrittää:
- Tausta- ja etu värit.
- Vakiot
ANSIväri paletti. - Kursorin ja valinnan taustavärit.
Esimerkki:
TerminalTheme theme = new TerminalTheme();
theme.setBackground("#1e1e1e");
theme.setForeground("#cccccc");
terminal.setTheme(theme);
Näytä koodi
- Java
Tuetut sekvenssit
Terminaali tukee laajaa valikoimaa vakiokontrollisekvenssejä, joita käytetään kursorin siirtoon, näyttöpäivityksiin ja tekstiformaattiin.
Tunnetut ryhmät:
C0ohjauskoodit (yksi-bittiset 7-bittiset komennot,\x00,\x1F, kuten backspace ja rivinvaihto)C1ohjauskoodit (yksi-bittiset 8-bittiset komennot,\x80,\x9F)ESCsekvenssit (alkaenESC(\x1B), kuten tallenna/palauta kursori, näytön kohdistus)CSIsekvenssit (Kontrollisekvenssin esittely,ESC [taiCSI (\x9B), kuten vierittämiseen, pyyhkimiseen ja tyylittelyyn)DCSsekvenssit (Laitteen ohjausmerkit,ESC PtaiDCS (\x90))OSCsekvenssit (Käyttöjärjestelmän komennot,ESC ]taiOSC (\x9D), esimerkiksi ikkunan otsikon, hyperlinkkien ja värien asettamiseen)
Joitan eksoottisia sekvenssityyppejä kuten APC, PM ja SOS tunnistetaan, mutta niitä ei huomioida.
Mukautettuja sekvenssejä voidaan tukea integraatioiden kautta tarvittaessa.