Terminal
Terminal-komponentti on interaktiivinen terminaalisimulaattori, joka käyttäytyy kuten perinteinen järjestelmäkonsoli. Se käsittelee tekstilähtöä, käyttäjän syötettä, ohjaussekvenssejä ja näytön puskureita, mikä tekee siitä sopivan etäyhteystyökalujen, tekstipaneelien, upotettujen komentokonsolien tai virheenkorjauskonsolien rakentamiseen.
Luodaan terminaali
Käyttääksesi Terminal-komponenttia sovelluksessasi, varmista, että olet ottanut mukaan seuraavan riippuvuuden pom.xml-tiedostossasi.
<dependency>
<groupId>com.webforj</groupId>
<artifactId>webforj-terminal</artifactId>
</dependency>
Seuraava esimerkki rakentaa interaktiivisen komentorivin kirjoitetuilla komennoilla, historiateksteillä ja mukautetulla lähtöarvolla.
Näytä koodi
- TerminalView.java
- TerminalCommand.java
- ClearCommand.java
- DateCommand.java
- HelpCommand.java
- MsgCommand.java
- ConfirmCommand.java
- TimeCommand.java
- terminal-view.css
Kuinka se toimii
Terminaali hallitsee tekstisoluja, käsittelee saapuvia merkkivirtoja ja reagoi käyttäjätoimiin, kuten kirjoittamiseen tai tekstin valitsemiseen. Se tulkitsee automaattisesti ohjausmerkkejä ja pakenemissekvenssejä osoitinkäytölle, värimuutoksille ja näytön tyhjentämiselle.
Keskeiset toiminnat sisältävät:
- Tietojen syöttö: Tietojen kirjoittaminen terminaaliin päivittää näyttöä, käsitellen sekä tekstiä että ohjaussekvenssejä.
- Tietojen lähtö: Tallentaa käyttäjän näppäinpainallukset ja lähettää ne strukturoituna tapahtumana.
- Näytön hallinta: Säilyttää vieritettävän historian ja nykyisen näytön tilan.
- Osoittimen hallinta: Seuraa osoittimen sijaintia tekstisyötössä ja ohjaussekvenssivastauksissa.
Terminaali on tilallinen, mikä tarkoittaa, että se rakentaa oikein monta tavuista merkkejä ja ylläpitää jatkuvuutta fragmentoiduissa syötteissä.
Datan lähettäminen terminaaliin
Data lähetetään terminaaliin write- ja writeln-menetelmien avulla:
write(Object data): Lähettää dataa terminaalivirtaan.writeln(Object data): Lähettää dataa, jota seuraa rivinvaihto.
Terminaali käsittelee kaikki saapuvat tiedot UTF-16-merkkijonoina. Se käsittelee automaattisesti monta tavuista merkkejä, jopa silloin kun syöte saapuu fragmentoituna.
Esimerkki
terminal.write("echo Hello World\n");
terminal.writeln("Ready.");
Voit myös liittää takaisinsoiton, joka suoritetaan, kun datakuormaa 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 syötteen kahden tapahtuman kautta:
- Data-tapahtuma (
onData): Laajentuu kun tekstisyöttö tapahtuu, lähettäen Unicode-merkkejä. - Näppäintapahtuma (
onKey): Laajentuu jokaiselle näppäinpainallukselle, mukaan lukien tietoa näppäinkoodista ja muuntajista kuten Ctrl tai Alt.
Näitä tapahtumia voidaan käyttää käyttäjän syötteen välittämiseen taustalle, 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 terminaalissa tallennettu käyttäjän syöte (esimerkiksi onData-tapahtumista) lähetetään UTF-16 merkkijonoina.
Jos taustasi odottaa erilaista koodausta (kuten UTF-8-tavupaketteja), sinun on käsiteltävä data manuaalisesti.
Suurten datavirtojen käsittely
Koska terminaali ei voi heti renderöidä rajatonta syötettä, se ylläpitää sisäistä syöttöpuskuria. Jos tämä puskuri kasvaa liian suureksi (oletuksena noin 50MB), uudet saapuvat tiedot voidaan hylätä järjestelmän suorituskyvyn suojaamiseksi.
Jotta hallita nopeasti liikkuvia datalähteitä, sinun tulisi toteuttaa virranhallinta.
Perusvirranhallintaesimerkki
Keskeytä taustasi, kunnes terminaali on käsitellyt tietyn datakuorman:
pty.onData(chunk -> {
pty.pause();
terminal.write(chunk, result -> {
pty.resume();
});
});
Vesileima-virranhallintaesimerkki
Tehokkaampaa hallintaa varten käytä korkea/ matala vesileima:
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
- ServerLogsView.java
Mukauttaminen
Terminal-optsiot
TerminalOptions-luokka antaa sinun konfiguroida käyttäytymistä:
- Osoittimen vilkkuminen.
- Fonttisäädöt (perhe, koko, paino).
- Palautushistorian koko.
- Rivikorkeus ja kirjaimen väli.
- Esteettömyyssäädöt (ruudunlukuohjelman tila).
Esimerkki:
TerminalOptions options = new TerminalOptions()
.setCursorBlink(true)
.setFontFamily("Courier New, monospace")
.setFontSize(13)
.setScrollback(5000);
terminal.setOptions(options);
Terminal-teema
Voit tyylitellä terminaalia käyttämällä TerminalTheme, joka määrittelee:
- Tausta- ja etuplanan värit.
- Vakiot
ANSI-väripaletti. - Osoittimen ja valinnan taustavärit.
Esimerkki:
TerminalTheme theme = new TerminalTheme();
theme.setBackground("#1e1e1e");
theme.setForeground("#cccccc");
terminal.setTheme(theme);
Näytä koodi
- TerminalThemePickerView.java
Tuetut sekvenssit
Terminaali tukee laajaa valikoimaa vakio-ohjaussekuensseja, joita käytetään osoittimen liikuttamiseen, näytön päivityksiin ja tekstin muotoiluun.
Tunnistetut ryhmät:
C0ohjauskoodit (yksi tavu 7-bittiset komennot,\x00,\x1F, kuten taaksepäin meneminen ja rivinvaihto)C1ohjauskoodit (yksi tavu 8-bittiset komennot,\x80,\x9F)ESCsekvenssit (alkaenESC(\x1B), kuten osoittimen tallentaminen / palauttaminen, näytön kohdistaminen)CSIsekvenssit (Ohjaussekuenssien esittely,ESC [taiCSI (\x9B), toiminnoille kuten vierittäminen, tyhjentäminen ja tyylittely)DCSsekvenssit (Laitteen Ohjausmerkit,ESC PtaiDCS (\x90))OSCsekvenssit (Käyttöjärjestelmän komennot,ESC ]taiOSC (\x9D), kuten ikkunan otsikon asettaminen, hyperlinkit ja värit)
Joidenkin eksoottisten sekvenssityyppien, kuten APC, PM ja SOS, tunnistavat mutta hiljaisesti ignoroi.
Mukautettuja sekvenssejä voidaan tukea tarvitsematta integraatioita.