Terminal
Komponentti Terminal
tarjoaa interaktiivisen terminaali-emuloinnin, joka toimii paljon kuten perinteinen järjestelmäkonsoli. Se mahdollistaa sovellusten näyttävän ja käsittelevän tekstipohjaista käyttöliittymää, käsitellen tekstilähtöä, vastaanottaen käyttäjän syötettä, tulkitsemalla ohjaussekvenssejä ja ylläpitäen näyttöhistoriaa.
Tämä terminaali on suunniteltu tarjoamaan luotettavaa toimintaa erilaisissa käyttötarkoituksissa, kuten etäkäyttötyökalujen rakentamisessa, tekstipohjaisten hallintapaneelien, upotettujen komento-shellien tai interaktiivisten virheenkorjauskonsoleiden luomisessa.
Käyttääksesi Terminal
-komponenttia sovelluksessasi, varmista, että sisällytät seuraavan riippuvuuden pom.xml-tiedostoon.
<dependency>
<groupId>com.webforj</groupId>
<artifactId>webforj-terminal</artifactId>
</dependency>
Näytä Koodi
- Java
Kuinka se toimii
Terminaali hallitsee tekstisolujen ruudukkoa, käsittelee saapuvia merkistöjä ja reagoi käyttäjän toimintoihin, kuten kirjoittamiseen tai tekstin valintaan. Se tulkitsee automaattisesti ohjausmerkit ja pakoteseqvenssit osoittimen liikkumista, väri muuttumista ja näytön tyhjentämistä varten.
Ydinkäyttäytymisiin sisältyy:
- Datan syöttö: Datan kirjoittaminen terminaaliin päivittää näyttöä, käsitellen sekä tekstiä että ohjausseqvenssejä.
- Datan tuotto: Tallentaa käyttäjän näppäinyhdistelmät ja lähettää ne rakenteellisina tapahtumina.
- Näytön hallinta: Ylläpitää vieritettävää historiaa ja nykyistä näyttötilaa.
- Osoittimen hallinta: Seuraa osoittimen sijaintia tekstin syöttöä ja ohjaussekvenssivastauksia varten.
Terminaali on tilallinen, mikä tarkoittaa, että se rekonstruoi oikein monibittiset merkit ja ylläpitää jatkuvuutta fragmentoitujen syötteiden välillä.
Datavirran lähettäminen terminaaliin
Data lähetetään terminaaliin käyttämällä write
ja writeln
menetelmiä:
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 monibittiset merkit, vaikka syöttö saapuisi fragmentoituneina paloina.
Esimerkki
terminal.write("echo Hello World\n");
terminal.writeln("Ready.");
Voit myös liittää palautteen, joka suoritetaan, kun datapalautus on käsitelty:
terminal.write("Pitkä komento 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 Event (
onData
): Laukaisee, kun tekstisyöttö tapahtuu, lähettäen Unicode-merkkejä. - Key Event (
onKey
): Laukaisee jokaisesta näppäinpainalluksesta, mukaan lukien tietoa näppäin-koodeista ja -muokkaimista, kuten Ctrl tai Alt.
Nämä tapahtumat voidaan käyttää käyttäjän syötteen välittämiseen taustajärjestelmälle, UI-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 terminaalin tallentama käyttäjän syöte (kuten onData
tapahtumista) lähetetään UTF-16 merkkijonoina.
Jos taustajärjestelmäsi odottaa eri koodausta (kuten UTF-8 tavuina), sinun on käsiteltävä data manuaalisesti.
Suuri datavirtojen käsittely
Koska terminaali ei voi heti renderöidä rajatonta syötettä, se ylläpitää sisäistä syöttöbuffettia. Jos tämä bufferi kasvaa liian suureksi (oletusarvo noin 50MB
), uudet saapuvat tiedot voidaan pudottaa järjestelmän suorituskyvyn suojelemiseksi.
Huolellista hallintaa nopeissa datalähteissä varten pitäisi toteuttaa virtausohjaus.
Perus virtausohjauksen esimerkki
Pysäytä taustajärjestelmäsi, kunnes terminaali on käsitellyt datapalautuksen:
pty.onData(chunk -> {
pty.pause();
terminal.write(chunk, result -> {
pty.resume();
});
});
Vesileimavirtausohjauksen esimerkki
Tehokkaampaa hallintaa varten 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 konfiguroinnin:
- Osoittimen vilkkuminen.
- Fonttisäännöt (perhe, koko, paksuus).
- Vierityshistorian koko.
- Rivikorkeus ja kirjaintila.
- Esteettömyysasetukset (ruudunluku-tila).
Esimerkki:
TerminalOptions options = new TerminalOptions()
.setCursorBlink(true)
.setFontFamily("Courier New, monospace")
.setFontSize(13)
.setScrollback(5000);
terminal.setOptions(options);
Terminaalitema
Voit tyylitellä terminaalia käyttämällä TerminalTheme
, joka määrittelee:
- Tausta- ja etu-värit.
- Standardi
ANSI
väriasteikko. - Osoittimen 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 standardeja ohjausseqvenssejä, joita käytetään osoittimen liikkumiseen, näytön päivityksiin ja tekstin muotoiluun.
Tunnistettuja ryhmiä:
C0
ohjauskoodit (yksibittiset 7-bittiset komennot,\x00
,\x1F
, kuten backspace ja rivinvaihto)C1
ohjauskoodit (yksibittiset 8-bittiset komennot,\x80
,\x9F
)ESC
sekvenssit (alkavatESC
(\x1B
), kuten tallenna/palauta osoitin, näytön tasaaminen)CSI
sekvenssit (Ohjaussekvenssien esittelijä,ESC [
taiCSI (\x9B)
, toimintojen kuten vierityksen, pyyhkimisen ja tyylittelyn varten)DCS
sekvenssit (Laitteen ohjausmerkit,ESC P
taiDCS (\x90)
)OSC
sekvenssit (Käyttöjärjestelmän komennot,ESC ]
taiOSC (\x9D)
, kuten ikkunan otsikon, hyperlinkkien ja värien asettaminen)
Jotkut eksoottiset sekvenssityypit, kuten APC
, PM
ja SOS
, tunnistetaan mutta niitä sivuutetaan hiljaa.
Mukautettuja sekvenssejä voidaan tukea integrointien kautta tarvittaessa.