Siirry pääsisältöön

Terminal

Avaa ChatGPT:ssä
Varjo dwc-terminal 24.10
Java API

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

Terminalin tuonti

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

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.

Vanhan ajan koodaukset

Terminaali ei tue vanhan ajan koodauksia kuten ISO-8859. Jos tarvitset yhteensopivuutta ei-UTF-8-järjestelmien kanssa, käytä ulkoista koodauskonvertteria (esimerkiksi luit tai iconv) muuntaaksesi data ennen sen kirjoittamista tai lukemista terminaalista.

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

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

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:

  • C0 ohjauskoodit (yksi tavu 7-bittiset komennot, \x00, \x1F, kuten taaksepäin meneminen ja rivinvaihto)
  • C1 ohjauskoodit (yksi tavu 8-bittiset komennot, \x80, \x9F)
  • ESC sekvenssit (alkaen ESC (\x1B), kuten osoittimen tallentaminen / palauttaminen, näytön kohdistaminen)
  • CSI sekvenssit (Ohjaussekuenssien esittely, ESC [ tai CSI (\x9B), toiminnoille kuten vierittäminen, tyhjentäminen ja tyylittely)
  • DCS sekvenssit (Laitteen Ohjausmerkit, ESC P tai DCS (\x90))
  • OSC sekvenssit (Käyttöjärjestelmän komennot, ESC ] tai OSC (\x9D), kuten ikkunan otsikon asettaminen, hyperlinkit ja värit)
Eksoottisten ja mukautettujen sekvenssien käsittely

Joidenkin eksoottisten sekvenssityyppien, kuten APC, PM ja SOS, tunnistavat mutta hiljaisesti ignoroi. Mukautettuja sekvenssejä voidaan tukea tarvitsematta integraatioita.

Tyylittely

Loading...