Note de programator Jconsole

În lumea Java, nu există o bibliotecă pentru logarea sistemului. Fiecare dintre ele are propriile sale avantaje și dezavantaje, poate fi scris pentru un timp infinit de lung. Dar dezvoltatorii deseori evită utilizarea unor sisteme complexe de logare și folosesc metode dovedite (deși nu fără defecte): trimiterea mesajelor către fluxurile System.out și System.err.

Note de programator Jconsole


În acest articol, vom crea o componentă proprie pentru afișarea conținutului fluxurilor System.out și System.err. Voi încerca să prezint materialul în cât mai multe detalii, astfel încât să poată fi înțeles chiar și de către programatorii de java novici.

Java I / O fluxuri.

Acum, rețineți că putem redefini contravaloarea și erorile de fire interesate de utilizarea următoarelor metode:

Argumentele acestor metode sunt clasele java.io.PrintStream, ale căror instanțe sunt create cu ușurință pe baza oricărei implementări a clasei abstracte OutputStream. Toți succesorii lui OutputStream trebuie să implementeze o singură metodă:

Astfel, pentru a ne rezolva problema, trebuie să scriem o clasă moștenitoare de la OutputStream, să implementăm metoda de scriere în ea și să înlocuim firele standard System.out și System.err cu ea.

Selectați componenta pentru ieșirea mesajelor.

Acum, că am dat seama cum să cârlig de ieșire la fire standard, trebuie să decidem unde să-l redirecționeze la fire standard. De fapt, răspunsul la această întrebare este limitat doar de imaginația dvs., dar în acest articol vom selecta componenta vizuală a JTextPane din biblioteca javax.swing.
Componenta JTextPane este extrem de funcțională, iar descrierea completă va dura prea mult timp, așa că omitem detaliile și ne concentrăm doar pe capabilitățile de care avem nevoie.

Dezvoltarea componentei JConsole.


> Deci, să definim exact ceea ce dorim din componenta dezvoltată:
  • Atunci când plasați o componentă pe sistem, trebuie să înlocuiască fluxurile standard System.out și System.err pentru a le transmite conținutul.
  • Toate posturile fluxuri redefinite nu ar trebui să fie lăsată doar în componenta, dar, de asemenea, ajunge în fluxul, care au fost menționate afară și greseasca pentru a trece peste componenta noastră (acest lucru se va vedea în continuare un mesaj de pe consola în IDE).
  • Mesajele diferitelor fire ar trebui afișate în culori diferite.
  • Culorile pentru ieșirea mesajelor trebuie să fie personalizabile (adică componenta trebuie să aibă metode pentru specificarea culorii ieșirii mesajelor).
Pfiu! Se pare că, cu o sarcină și căile de rezolvare a acesteia am decis, cea mai interesantă este implementarea!

Să creați propria componentă, moștenită de la JTextPane și să o numiți JConsole:


Să scriem o metodă de adăugare a textului la componenta noastră:

Să încercăm să înțelegem ce se întâmplă. În prima linie a metodei, vom crea cel mai simplu set de atribute de text și apoi vom defini culoarea în care va fi afișat textul. În blocul de încercare, obținem indexul ultimului caracter din textul curent al documentului nostru. Apoi adăugați o linie cu atribute create anterior.
Fundația este pusă. Acum trebuie să scrieți implementarea OutputStream și să o înlocuiți cu fire standard.

Când scrieți fluxul de ieșire trebuie să suprascrie doar o singură metodă - scriere (int b). Dar pentru a deduce un șir de un caracter nu este foarte optimizat, astfel încât pentru a optimiza, vom trece peste, de asemenea, write (byte [] b, int off, int len) și scrie (byte [] b), precum și a adăuga o proprietate care conține culoarea care vom afișa conținutul acestui flux.

* În general, pentru o mai mare flexibilitate, am putea avea în magazin, nu doar o singură culoare, ci o instanță a AttributeSet, dar din moment ce ne-am decis să limiteze formatarea textului numai în culoare, păstrați-l și să devină.


Codul clasei rezultate este destul de simplu, cu o singură excepție: dacă observați, vom numi metoda insertText ca și cum ar fi o metodă a clasei ConsoleOutputStream, dar de fapt este o metodă JConsole! Ne este permis să facem acest lucru numai pentru că ConsoleOutputStream este o clasă imbricată pentru JConsole.

Deși nu toate funcționalitățile pe care le-am declarat sunt gata, să admirăm deja creația noastră! Pentru aceasta, creați o altă clasă de testare, moștenită de la JFrame. Adăugați componenta și butonul nostru, făcând clic pe care vom afișa mesajul în fluxul System.out și vom genera o eroare, stiva de apel înaintea căreia va fi tipărită în System.err:

Făcând aplicația și făcând clic pe buton, vedem următoarea imagine:

Note de programator Jconsole


Arată exact așa cum ne-am dorit. Dar, din păcate, mesajele, firele suprasolicitate, rămân numai în componentă și nu ajung la consola IDE. Și culorile cu care sunt afișate mesajele sunt strâns incluse în codul componentei noastre. Să rezolvăm asta.

Pentru a face acest lucru, mai întâi, vom crea un câmp cu fluxul nostru cu un link către fluxul înlocuit. În al doilea rând vom scrie metode pentru schimbarea culorii fluxului nostru. În al treilea rând, înainte de redefinirea firelor, le vom aminti și le vom arunca înaintea lor apelurile implementărilor noastre ale metodelor de scriere.

Codul sursă pentru componenta rezultată: