מצב ג'אווה ללא ראש
1. סקירה כללית
מדי פעם, אנחנו צריכים לעבוד עם יישומים מבוססי גרפיקה ב- Java ללא תצוגה ממשית, מקלדת או עכברנניח בשרת או במכולה. במדריך קצר זה, אנו הולכים ללמוד על המצב ללא ראש של Java כדי לטפל בתרחיש זה. נבדוק גם מה אנחנו יכולים לעשות במצב ללא ראש ומה לא. ישנן דרכים רבות בהן אנו יכולים להגדיר מצב ללא ראש ב- Java באופן מפורש: אם הסביבה אכן חסרת ראש, ה- JVM היה מודע לכך באופן מרומז. עם זאת, יהיו הבדלים עדינים בכמה תרחישים. נראה אותם בקרוב. מקרה שימוש אופייני של רכיבי ממשק משתמש הפועלים בסביבה ללא ראש יכול להיות אפליקציית ממיר תמונות. למרות שהוא זקוק לנתונים גרפיים לעיבוד תמונה, תצוגה אינה ממש נחוצה. ניתן להריץ את האפליקציה בשרת ולקבצים מומרים שנשמרו או נשלחו ברשת למכונה אחרת לתצוגה. בואו נראה את זה בפעולה. ראשית, נפעיל את המצב ללא ראש באופן תכנותי ב JUnit מעמד: כדי לוודא שהוא מוגדר כהלכה, נוכל להשתמש בו java.awt.GraphicsEnvironment#הוא ללא ראש: עלינו לזכור כי המבחן הנ"ל יצליח בסביבה נטולת ראש גם אם המצב לא מופעל במפורש. בואו נראה את ממיר התמונות הפשוט שלנו: במדגם הבא זה אנו יכולים לראות כי מידע על כל הגופנים, כולל מדדי הגופן, זמין גם לנו: ישנם רכיבים הדורשים מכשירים היקפיים ולא יפעלו במצב ללא ראש. הם זורקים א חריג ללא ראש כאשר משתמשים בסביבה שאינה אינטראקטיבית: בדיקה זו קובעת כי השימוש ב מִסגֶרֶת במצב ללא ראש אכן יזרוק א חריג ללא ראש: ככלל אצבע, זכור כי רכיבים ברמה העליונה כגון מִסגֶרֶת ו לַחְצָן תמיד זקוק לסביבה אינטראקטיבית וישליך את החריג הזה. למרות זאת, זה ייזרק כבלתי ניתן לשחזור שְׁגִיאָה אם המצב ללא ראש אינו מוגדר במפורש. בשלב זה, אנו עשויים לשאול שאלה לעצמנו - אך מה אם יש לנו קוד עם רכיבי GUI להפעלה בשני סוגי הסביבות - מכונת ייצור בראשות ושרת ניתוח קוד קוד ללא ראש? בדוגמאות לעיל ראינו שרכיבי המשקל הכבד לא יעבדו על השרת וישליכו חריג. אז נוכל להשתמש בגישה מותנית: באמצעות דפוס זה, אנו יכולים ליצור אפליקציה גמישה המתאימה את התנהגותה בהתאם לסביבה. בדוגמאות קוד שונות ראינו כיצד ומדוע במצב ללא ראש בג'אווה. מאמר טכני זה מספק רשימה מלאה של כל מה שניתן לעשות בזמן פעולה במצב ללא ראש. כרגיל, קוד המקור לדוגמאות לעיל זמין ב- GitHub.2. הגדרת מצב ללא ראש
3. דוגמאות לרכיבי ממשק משתמש במצב ללא ראש
@ לפני בטל הציבורי setUpHeadlessMode () {System.setProperty ("java.awt.headless", "true"); }
@ מבחן ציבורי בטל כאשר SetUpSuccessful_thenHeadlessIsTrue () {assertThat (GraphicsEnvironment.isHeadless ()). IsTrue (); }
@ מבחן ציבורי בטל כאשר HeadlessMode_thenImagesWork () {תוצאה בוליאנית = שקר; נסה (InputStream inStream = HeadlessModeUnitTest.class.getResourceAsStream (IN_FILE); FileOutputStream outStream = FileOutputStream חדש (OUT_FILE)) {BufferedImage inputImage = ImageIO.read (inStream); תוצאה = ImageIO.write (inputImage, FORMAT, outStream); } assertThat (תוצאה). isTrue (); }
@ מבחן ציבורי בטל כאשר Headless_thenFontsWork () {GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); גופני מחרוזת [] = ge.getAvailableFontFamilyNames (); assertThat (גופנים) .isNotEmpty (); גופן גופן = גופן חדש (גופנים [0], פונט.BOLD, 14); FontMetrics fm = (בד חדש ()). GetFontMetrics (פונט); assertThat (fm.getHeight ()). isGreaterThan (0); assertThat (fm.getAscent ()). isGreaterThan (0); assertThat (fm.getDescent ()). isGreaterThan (0); }
4. חריג ללא ראש
חריג בשרשור "ראשי" java.awt.HeadlessException ב java.awt.GraphicsEnvironment.checkHeadless (GraphicsEnvironment.java:204) ב java.awt.Window. (Window.java:536) ב java.awt.Frame. (מסגרת. ג'אווה: 420)
@ מבחן ציבורי בטל כאשרHeadlessmode_thenFrameThrowsHeadlessException () {assertThatExceptionOfType (HeadlessException.class) .isThrownBy (() -> {Frame frame = New Frame (); frame.setVisible (true); frame.setSize (120, 120);}); }
5. עקיפת רכיבים במשקל כבד במצב ללא ראש
חלל ציבורי FlexibleApp () {if (GraphicsEnvironment.isHeadless ()) {System.out.println ("שלום עולם"); } אחר {JOptionPane.showMessageDialog (null, "שלום עולם"); }}
6. מסקנה