Jconsole programozó megjegyzi
A Java világban nincs könyvtár a rendszer naplózásához. Mindegyiknek megvannak a maga előnyei és hátrányai, végtelenül hosszú ideig írható. De gyakran a fejlesztők elkerülik a komplex naplózási rendszereket, és bevált módszereket használnak (de nem hibák nélkül): a kimeneti üzeneteket a System.out és a System.err streamekhez.
Ebben a cikkben létrehozzuk saját komponensünket a System.out és a System.err stream tartalmának megjelenítéséhez. Megpróbálom bemutatni az anyagot annyira részletesen, hogy ez még a kezdő java programozók számára is megérthető legyen.
Java I / O streamek.
Most pedig vegye figyelembe, hogy újra és újra meghatározhatjuk a következő módszerek használatával kapcsolatos érdeklődését:
E módszerek érvei a java.io.PrintStream osztályok, amelyek példányai könnyen létrehozhatók az elvont osztályú OutputStream végrehajtása alapján. Az OutputStream összes követőjének csak egy módszert kell végrehajtania:
Így a probléma megoldásához meg kell adnunk egy osztályt, amely örökölte a OutputStream-ot, végrehajtja az írási módot, és kicseréli a System.out és a System.err szabvány szálakat.
Válassza ki az üzenetek kimenő összetevőit.
Most, hogy kitaláltuk, hogyan kell a kimenetet szabványos szálakkal összekapcsolni, el kell döntenünk, hogy hová kell átirányítani a szabvány szálakra. Valójában a kérdésre adott válasz csak a képzeleted által korlátozott, de ehhez a cikkhez a JTextPane vizuális komponensét választjuk ki a javax.swing könyvtárból.
A JTextPane komponens rendkívül funkcionális, és teljes leírása túl sok időt vesz igénybe, így elhagyjuk a részleteket, és csak a szükséges képességekre koncentrálunk.
A JConsole komponens fejlesztése.
> Tehát, definiáljuk, hogy pontosan mit akarunk a kifejlesztett komponensből:
- Amikor egy komponenst helyez el a rendszerbe, felül kell hagynia a szabványos System.out és System.err streameket a tartalmuk kiadásához.
- Minden hozzászólás újra flow nem hagyható csak az alkatrész, hanem bejutni az áramlás, amely már említett, és tévesen felülírni a komponens (ez még mindig egy üzenet jelenik meg a konzolon a IDE).
- A különböző szálak üzeneteit különböző színekben kell megjeleníteni.
- Az üzenetek kimenetének színeinek testre szabhatónak kell lenniük (azaz az összetevőnek rendelkeznie kell az üzenetek kimenetének színének meghatározására szolgáló módszerekkel).
Hozzunk létre saját komponenst, amelyet JTextPane-ből örököltünk és hívjuk JConsole-nak:
Írjunk egy olyan módszert, amellyel szöveget hozzáadhatunk a komponensünkhöz:
Próbáljuk megérteni, mi történik. A módszer első sorában a legegyszerűbb szöveg-attribútumokat állítjuk elő, majd meghatározzuk azt a színt, amelyben a szöveg megjelenik. A próbatestben a dokumentum aktuális szövegében kapjuk meg az utolsó karakter indexét. Ezután hozzáadjon egy sort a korábban létrehozott attribútumokkal.
Megalapítják az alapítványt. Most meg kell írni a OutputStream implementációt és cserélje ki szabványos szálakkal.
A kimeneti stream írása során csak egy módszert kell újra definiálni - írjunk (int b). De levezetni egy sor egy karakter nem nagyon optimalizálva, így optimalizálni, mi is felülírhatja a write (byte [] b, int le, int len) és írási (byte [] b), valamint hozzá egy tulajdonság, amely tartalmazza azt a színt, megjelenítjük a tartalom tartalmát.
* Általában a nagyobb rugalmasság, mi volna a boltban nem csak egy szín, hanem egy példánya AttributeSet, de mivel úgy döntöttünk, hogy a formázás a szöveg csak színében tartani, és lesz.
A kapott osztály kódot elég egyszerű, egy kivétellel: ha azt észleli, insertText eljárás hívjuk, mintha egy osztály módszer ConsoleOutputStream, de valójában ez a módszer jconsole! Ezt csak azért tehetjük meg, mert a ConsoleOutputStream a JConsole nevű beágyazott osztály.
Bár nem minden készenléti funkciót készen állunk, máris megcsodáljuk a teremtésünket! Ehhez hozzon létre egy újabb tesztosztályt, amelyet a JFrame örökölt. Add hozzá a komponensünkhöz és a gombunkhoz, ha rákattintunk arra, hogy megjelenítjük az üzenetet a System.out adatfolyamban, és hibát generálunk, amely előtt a System.err kinyomtatja a híváscsomagot:
Az alkalmazás futtatásával és a gomb megnyomásával a következő képet láthatjuk:
Pontosan úgy néz ki, ahogy akartam. De sajnos az üzenetek, a felülírt szálak csak az összetevőben maradnak, és nem érik el az IDE konzolját. És az üzenetek színei szorosan be vannak ágyazva a komponensünk kódjába. Javítsuk meg ezt.
Ehhez először létrehozzunk egy mezőt a saját adatfolyamunkhoz, egy linkre a kicserélt adatfolyamhoz. A másodikban módokat fogunk írni a patak színének megváltoztatására. Harmadszor, a szálak újradefiniálása előtt emlékezni fogunk rájuk és dobjuk el őket az írási módszerek implementációinak hívásai előtt.
A kapott összetevő forráskódja: