Bezhlavý režim Java
1. Prehľad
Príležitostne musíme pracovať s grafickými aplikáciami v prostredí Java bez skutočného displeja, klávesnice alebo myši, povedzme na serveri alebo kontajneri. V tomto krátkom tutoriáli sa dozvieme o bezhlavom režime Java, ktorý bude slúžiť na riešenie tohto scenára. Taktiež sa pozrieme na to, čo môžeme robiť v bezhlavom režime a čo nie. Existuje mnoho spôsobov, ako môžeme v Jave explicitne nastaviť režim bez hlavy: Ak je prostredie skutočne bezhlavé, JVM by si to bolo implicitne vedomé. V niektorých scenároch však budú jemné rozdiely. Uvidíme ich čoskoro. Typickým prípadom použitia komponentov používateľského rozhrania bežiacich v bezhlavom prostredí môže byť aplikácia na prevod obrázkov. Aj keď na spracovanie obrazu potrebuje grafické údaje, displej nie je skutočne potrebný. Aplikáciu je možné spustiť na serveri a prevádzať súbory uložené alebo odoslané cez sieť na iné zariadenie na zobrazenie. Pozrime sa na to v akcii. Najskôr programovo zapneme bezhlavý režim v a JUnit trieda: Aby sme sa ubezpečili, že je správne nastavený, môžeme použiť java.awt.GrafikaŽivotné prostredie#je bezhlavý: Mali by sme na pamäti, že vyššie uvedený test uspeje v bezhlavom prostredí, aj keď režim nie je výslovne zapnutý. Teraz sa pozrime na náš jednoduchý prevodník obrázkov: V tejto ďalšej ukážke vidíme, že máme k dispozícii aj informácie o všetkých písmach vrátane metrík písma: Existujú komponenty, ktoré vyžadujú periférne zariadenia a nebudú fungovať v bezhlavom režime. Hodia a Bezhlavá výnimka pri použití v neinteraktívnom prostredí: Tento test potvrdzuje, že použitie Rám v bezhlavom režime skutočne hodí a Bezhlavá výnimka: Ako všeobecné pravidlo si pamätajte, že komponenty najvyššej úrovne ako napr Rám a Tlačidlo vždy potrebujete interaktívne prostredie a vyvolá túto výnimku. Avšak bude vyhodený ako nenahraditeľný Chyba ak nie je bezhlavý režim výslovne nastavený. V tomto okamihu si možno kladieme otázku sami pre seba - ale čo keď máme kód s komponentmi grafického používateľského rozhrania, ktorý bude fungovať v obidvoch typoch prostredí - produkčný stroj s hlavičkou a server na analýzu zdrojového kódu bez hlavy? Vo vyššie uvedených príkladoch sme videli, že komponenty vysokej váhy nebudú na serveri fungovať a spôsobia výnimku. Môžeme teda použiť podmienený prístup: Pomocou tohto vzoru môžeme vytvoriť flexibilnú aplikáciu, ktorá upraví jej správanie podľa prostredia. S rôznymi ukážkami kódu sme videli, ako a prečo bezhlavý režim v Jave. Tento technický článok poskytuje kompletný zoznam toho, čo všetko je možné urobiť pri práci v bezhlavom režime. Ako obvykle je zdrojový kód vyššie uvedených príkladov k dispozícii na serveri GitHub.2. Nastavenie režimu bez hlavy
3. Príklady komponentov používateľského rozhrania v bezhlavom režime
@Before public void setUpHeadlessMode () {System.setProperty ("java.awt.headless", "true"); }
@Test public void whenSetUpSuccessful_thenHeadlessIsTrue () {assertThat (GraphicsEnvironment.isHeadless ()). IsTrue (); }
@Test public void whenHeadlessMode_thenImagesWork () {boolean result = false; try (InputStream inStream = HeadlessModeUnitTest.class.getResourceAsStream (IN_FILE); FileOutputStream outStream = nový FileOutputStream (OUT_FILE)) {BufferedImage inputImage = ImageIO.read (inStream); výsledok = ImageIO.write (inputImage, FORMAT, outStream); } assertThat (vysledok) .isTrue (); }
@ Test public void whenHeadless_thenFontsWork () {GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); Reťazcové písma [] = ge.getAvailableFontFamilyNames (); assertThat (fonty) .isNotEmpty (); Písmo písma = nové Písmo (písma [0], Font.BOLD, 14); FontMetrics fm = (nové Canvas ()). GetFontMetrics (písmo); assertThat (fm.getHeight ()). isGreaterThan (0); assertThat (fm.getAscent ()). isGreaterThan (0); assertThat (fm.getDescent ()). isGreaterThan (0); }
4. Bezhlavá výnimka
Výnimka vo vlákne „main“ java.awt.HeadlessException na java.awt.GraphicsEnvironment.checkHeadless (GraphicsEnvironment.java:204) na java.awt.Window. (Window.java:536) na java.awt.Frame. (Frame. java: 420)
@Test public void whenHeadlessmode_thenFrameThrowsHeadlessException () {assertThatExceptionOfType (HeadlessException.class) .isThrownBy (() -> {Frame frame = new Frame (); frame.setVisible (true); frame.setSize (120, 120);}); }
5. Obchádzanie komponentov vysokej váhy v bezhlavom režime
public void FlexibleApp () {if (GraphicsEnvironment.isHeadless ()) {System.out.println ("Hello World"); } else {JOptionPane.showMessageDialog (null, "Hello World"); }}
6. Záver