Terminal
Terminal-komponentti on interaktiivinen terminaalimalline, joka käyttäytyy kuten perinteinen järjestelmäkonsoli. Se käsittelee tekstilähtöä, käyttäjän syötettä, ohjaussekvenssejä ja näyttöpuskureita, mikä tekee siitä sopivan etäyhteystyökalujen, tekstinäyttöjen, upotettujen komentokehien tai vianetsintäkonsolien rakentamiseen.
Luo terminaali
Voit käyttää Terminal-komponenttia sovelluksessasi varmistamalla, että sisällytät seuraavan riippuvuuden pom.xml-tiedostoon.
<dependency>
<groupId>com.webforj</groupId>
<artifactId>webforj-terminal</artifactId>
</dependency>
Seuraava esimerkki rakentaa interaktiivisen komentokehän kirjoitettuina komennoilla, histori navigoinnilla ja mukautetulla lähdöllä.
Näytä koodi
- TerminalView.java
- TerminalCommand.java
- ClearCommand.java
- DateCommand.java
- HelpCommand.java
- MsgCommand.java
- PromptCommand.java
- TimeCommand.java
- terminal-view.css
Kuinka se toimii
Terminaali hallitsee tekstisolujen ruudukkoa, käsittelee saapuvia merkistön virtoja ja reagoi käyttäjätoimiin, kuten kirjoittamiseen tai tekstin valintaan. Se tulkitsee automaattisesti ohjausmerkkejä ja pakonopeuksia suurennuslasin liikuttamiseen, värimuutoksiin ja näytön tyhjentämiseen.
Keskeiset toiminnot sisältävät:
- Tieto syöttö: kirjoittamalla dataa terminaaliin, näyttö päivittyy ottaen huomioon sekä teksti- että ohjaussekvenssit.
- Tieto lähtö: tallentaa käyttäjän näppäinpainallukset ja lähettää ne rakenteisina tapahtumina.
- Näytön hallinta: ylläpitää vieritettävää historiapuskurointia ja nykyistä näytön tilaa.
- Kursori hallinta: seuraa kursorin sijaintia tekstisyöttöä ja ohjaussekvenssien vastauksia varten.
Terminaali on tilallinen, mikä tarkoittaa, että se kootaan oikein monibittiset merkit ja ylläpitää jatkuvuutta fragmentoituneessa syötteessä.
Datan lähettäminen terminaaliin
Data lähetetään terminaaliin käyttämällä write ja writeln -metodeja:
write(Object data): lähettää tietoa terminaalivirtaan.writeln(Object data): lähettää tietoa, jota seuraa uusi rivi.
Terminaali käsittelee kaiken saapuvan datan UTF-16 -merkkijonoina. Se käsittelee automaattisesti monibittiset merkit, jopa silloin kun syöte saapuu fragmentoituneina palasina.
Esimerkki
terminal.write("echo Hello World\n");
terminal.writeln("Valmis.");
Voit myös liittää palautekutsun, joka suoritetaan heti, kun datapalja 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 luoman syötteen kahden tapahtuman kautta:
- Datan tapahtuma (
onData): lauettuaan, kun tekstisyöttö tapahtuu, lähettäen Unicode-merkkejä. - Näppäintapahtuma (
onKey): lauettaa jokaiselle näppäinpainallukselle, mukaan lukien tietoa näppäinkoodista ja muuntimista, kuten Ctrl tai Alt.
Näitä tapahtumia voidaan käyttää käyttäjän syötteen välittämiseen taustapalvelimeen, 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 terminaalin kiinniottamat käyttäjän syötteet (kuten onData-tapahtumista) lähetetään UTF-16-merkkeinä.
Jos taustapalvelimesi odottaa eri koodausta (kuten UTF-8 -tavuna), sinun on manuaalisesti muunneltava dataa.
Suurten datavirtojen käsittely
Koska terminaali ei voi heti renderöidä rajatonta syötettä, se ylläpitää sisäistä syötepuskurointia. Jos tämä puskuri kasvaa liian suureksi (oletusarvo noin 50MB), uusi saapuva data voidaan pudottaa järjestelmän suorituskyvyn suojaamiseksi.
Nopeiden tietolähteiden asianmukaiseksi hallitsemiseksi sinun tulisi toteuttaa virtaohjaus.
Perusvirran ohjausesimerkki
Pysäytä taustapalvelin, kunnes terminaali on valmis käsittelemään paljan:
pty.onData(chunk -> {
pty.pause();
terminal.write(chunk, result -> {
pty.resume();
});
});
Vedenjakajavirra ohjausesimerkki
Tehokkaamman hallinnan vuoksi käytä korkeaa/matalan vedenjakajaa:
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
Terminaali asetukset
TerminalOptions-luokka mahdollistaa käyttäytymisen määrittämisen:
- Kursorin vilkkuminen.
- Fonttiasetukset (perhe, koko, paino).
- Välitön puskurin koko.
- Riviväli ja kirjamäärä.
- Esteettömyysasetukset (näyttöruudun lukija tila).
Esimerkki:
TerminalOptions options = new TerminalOptions()
.setCursorBlink(true)
.setFontFamily("Courier New, monospace")
.setFontSize(13)
.setScrollback(5000);
terminal.setOptions(options);
Terminaali teema
Voit tyylitellä terminaalia käyttämällä TerminalTheme, joka määrittelee:
- Tausta- ja etu värit.
- Standardi
ANSI-väripaletti. - Kursorin 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 vakiokontrollisekvenssejä, joita käytetään kursorin liikuttamiseen, näytön päivityksiin ja tekstimuotoiluun.
Tunnistettu ryhmät:
C0ohjauskoodit (yksisäikeiset 7-bittiset komennot,\x00,\x1F, kuten backspace ja rivinvaihto)C1ohjauskoodit (yksisäikeiset 8-bittiset komennot,\x80,\x9F)ESCsekvenssit (alkavatESC(\x1B), kuten kursorin tallentaminen/palauttaminen, näytön kohdistus)CSIsekvenssit (Ohjaussekvenssin esittelijä,ESC [taiCSI (\x9B), operaatioihin kuten vierittäminen, poistaminen ja tyylitys)DCSsekvenssit (Laitteen ohjausmerkit,ESC PtaiDCS (\x90))OSCsekvenssit (Käyttöjärjestelmän komennot,ESC ]taiOSC (\x9D), kuten ikkunan otsikon, hyperlinkkien ja värien asettaminen)
Jotkin eksoottiset sekvenssityypit, kuten APC, PM ja SOS, tunnistetaan, mutta niitä ei käsitellä.
Mukautettuja sekvenssejä voidaan tukea integrointien kautta tarvittaessa.