บทความนี้แนะนำวิธีการใช้โหมด Headless บน Java มาตรฐาน (Java SE หรือที่รู้จักกันในชื่อ J2SE) แพลตฟอร์ม
HEADLESS MODE คือการกำหนดค่าระบบเมื่อไม่มีการแสดงผลแป้นพิมพ์หรือเมาส์ มันฟังดูเหลือเชื่อ แต่ในความเป็นจริงคุณสามารถดำเนินการที่แตกต่างกันในโหมดนี้แม้จะมีข้อมูลกราฟิก
ฉันจะใช้รุ่นนี้ได้ที่ไหน ลองนึกถึงแอปพลิเคชันของคุณสร้างภาพอย่างต่อเนื่อง เมื่อสร้างรูปภาพคุณต้องใช้การแสดงผลหรือแป้นพิมพ์ สมมติว่าแอปพลิเคชันของคุณมีสถาปัตยกรรมหลักหรือเซิร์ฟเวอร์ที่เป็นกรรมสิทธิ์ แต่บริการนี้ไม่มีการแสดงผลแป้นพิมพ์หรือเมาส์ การตัดสินใจในอุดมคติคือการใช้พลังการประมวลผลภาพจำนวนมากแทนที่จะเป็นลักษณะที่ไม่ใช่ภาพ รูปภาพที่สร้างขึ้นในโหมดหัวขาดสามารถส่งผ่านไปยังระบบหัวเรื่องเพื่อการเรนเดอร์ที่ลึกกว่า
มีวิธีการมากมายใน Java.awt.toolkit และ Java.awt.Graphicsenvironment แต่บางหมวดหมู่เช่นผืนผ้าใบและแผงสามารถดำเนินการในโหมดหัวขาด หลังจากแพลตฟอร์ม J2SE 1.4 จะให้การสนับสนุนสำหรับโหมด Headless
หมายเหตุ: บทความนี้มุ่งเน้นไปที่เอกสารของเวอร์ชันแพลตฟอร์ม Java SE6 API หรือแพลตฟอร์ม Java SE ที่ได้รับการปรับปรุงอื่น ๆ ได้รับการตรวจสอบและอนุมัติโดยกลุ่มผู้เชี่ยวชาญ JSR270 (กลุ่มผู้เชี่ยวชาญ JSR 270)
ชุดเครื่องมือ
Java.awt.toolkit Class เป็นคลาสแม่ที่เป็นนามธรรมของชุดเครื่องมือหน้าต่างนามธรรม (AWT) คลาสย่อยของ Toolkit ใช้เพื่อผูกส่วนประกอบ AWT ต่างๆกับชุดเครื่องมือท้องถิ่นเฉพาะ
ส่วนประกอบจำนวนมากจะได้รับผลกระทบหากไม่รองรับอุปกรณ์แป้นพิมพ์หรือเมาส์ ตัวสร้างที่เหมาะสมควรโยนข้อยกเว้นหัวขาด:
ส่วนประกอบเฮฟวี่เวทนี้ต้องใช้ฟังก์ชั่นกราฟิกระดับเพียร์ -to -peer -level เพื่อรองรับ
ส่วนประกอบที่เกี่ยวข้องกับส่วนประกอบของผืนผ้าใบแผงและภาพไม่จำเป็นต้องโยนความผิดปกติของหัวเลี้ยวหัวต่อเพราะส่วนประกอบเหล่านี้สามารถใช้ฟังก์ชั่นว่างในระดับระบบปฏิบัติการและประมวลผลเป็นส่วนประกอบที่มีน้ำหนักเบา
Toolkit of Headless ยังผูกส่วนประกอบ Java กับทรัพยากรในท้องถิ่น แต่จะทำสิ่งนี้เฉพาะเมื่อทรัพยากรไม่รวมอุปกรณ์แสดงผลหรืออุปกรณ์อินพุต
สภาพแวดล้อมกราฟิก
คลาส java.awt.graphicsenvalonment เป็นคลาสนามธรรมที่อธิบายการรวบรวมวัตถุกราฟิกส์และวัตถุแบบอักษรที่สามารถใช้ในเทคโนโลยี Java ในแพลตฟอร์มที่กำหนด ทรัพยากรใน graphicsenvalonment สามารถเป็นอุปกรณ์ในพื้นที่หรือยาว -ยาว วัตถุ GraphicsDevice สามารถเป็นจอแสดงผลเครื่องพิมพ์หรือแคชกราฟิกและเป็นเป้าหมายของฟังก์ชั่นการวาดกราฟิก 2D กราฟิกแต่ละรายการมีวัตถุกราฟิกการกำหนดค่าจำนวนมากที่เกี่ยวข้อง วัตถุเหล่านี้ระบุสภาพแวดล้อมการกำหนดค่าที่แตกต่างกันและ graphicsDevice สามารถใช้ในสภาพแวดล้อมการกำหนดค่าเหล่านี้
ตารางที่ 1 แสดงวิธี graphicsenvalonment ตรวจสอบการรองรับโหมด headless
ตารางที่ 1. วิธีโหมดหัวหัว
หมายเหตุ: วิธีการ isheadless () ตรวจสอบแอตทริบิวต์ของระบบเฉพาะ java.awt.headless แทนการกำหนดค่าฮาร์ดแวร์ของระบบ
รหัสที่ถูกโยนโดย HeadlessException ขึ้นอยู่กับการแสดงผลแป้นพิมพ์และเมาส์เป็นสภาพแวดล้อมที่ไม่สนับสนุนสิ่งเหล่านี้
ตั้งค่าโหมด Headless
ใช้โหมด Headless เพื่อใช้งานคุณต้องเข้าใจวิธีการตรวจสอบและตั้งค่าแอตทริบิวต์ระบบที่เกี่ยวข้องกับสิ่งนี้ก่อน นอกจากนี้คุณต้องเข้าใจวิธีการสร้างคลาสการใช้งานแบบไม่มีหัวเพื่อใช้แถบเครื่องมือ
การกำหนดค่าแอตทริบิวต์ของระบบ
ในการเปิดใช้งานโหมดหัวขาดคุณต้องใช้เมธอด setProperty () เพื่อตั้งค่าแอตทริบิวต์ระบบที่สอดคล้องกัน วิธีนี้ช่วยให้คุณสามารถตั้งค่าแอตทริบิวต์ระบบด้วยค่าที่คาดหวัง
System.SetProperty ("java.awt.headless", "true");ในรหัสข้างต้น java.awt.headless เป็นแอตทริบิวต์ระบบและจริงคือค่าที่เราตั้งไว้
หากคุณต้องการใช้สภาพแวดล้อมที่ไม่มีหัวและแบบดั้งเดิมในหนึ่งในโปรแกรมเดียวกันคุณสามารถใช้บรรทัดคำสั่งต่อไปนี้เพื่อให้เสร็จสมบูรณ์:
java -djava.awt.headless = true
สร้างชุดเครื่องมือเริ่มต้น
หากคุณลักษณะของระบบของชื่อ java.awt.headless ถูกตั้งค่าเป็นจริงจะใช้ชุดเครื่องมือหัวหัว ถัดไปใช้เมธอด getDefaultToolkit () เพื่อสร้างอินสแตนซ์ของเครื่องมือหัวขาด:
Toolkit tk = toolkit.getdefaulttoolkit ();
ตรวจสอบโหมดหัวหัว
ในการตรวจสอบความสามารถในการใช้งานของโหมด Headess ให้ใช้วิธี isheadless () ของคลาส graphicsenvironment ::
graphicsenvironment ge = graphicsenvironment.getLocalgraphicsenvironment ();
วิธีนี้ตรวจสอบแอตทริบิวต์ระบบ java.awt.headless หากแอตทริบิวต์นี้มีค่าของความจริงมันจะโยน headlessException จากชุดเครื่องมือและการพึ่งพาบนจอแสดงผลแป้นพิมพ์และคลาส graphicsenvalonment ของเมาส์
การทำงานในโหมดหัวขาด
หลังจากตั้งค่าโหมด Headless และสร้างอินสแตนซ์ของชุดเครื่องมือแบบไม่มีหัวแล้วแอปพลิเคชันของคุณสามารถดำเนินการต่อไปนี้:
ผ้าใบ (ผ้าใบ)
รหัสต่อไปนี้จะวาดพื้นที่สี่เหลี่ยมผืนผ้าเปล่าบนหน้าจอและคุณสามารถวาดเส้นได้ คุณสามารถใช้คลาส Canvas เพื่อสร้างส่วนประกอบผ้าใบใหม่
ผืนผ้าใบสุดท้าย C = ใหม่ Canvas () {Public Void Paint (กราฟิก G) {สี่เหลี่ยมผืนผ้า r = getBounds (); , R.Width -1, 0);}};ฟอนต์ (แบบอักษร)
รหัสนี้แสดงวิธีใช้แบบอักษรเพื่อวาดสตริงข้อความและตั้งค่าตัวอักษรของข้อความ วัตถุกราฟิกใช้ในการวาดสตริงนี้
Public Void Paint (กราฟิก G) {G.SetFont (ตัวอักษรใหม่ ("Arial", Font.italic, 12); G.DrawString ("Test", 32, 8);}
สี
รหัสนี้แสดงวิธีใช้ค่าสีแดงสีเขียวและสีน้ำเงินที่ระบุเพื่อตั้งค่าสีของเส้น วัตถุกราฟิกใช้ในการวาดบรรทัดนี้
Public Void Paint (กราฟิก G) {G.SetColor (สีใหม่ (255, 127, 0));ภาพ
ในรหัสต่อไปนี้วิธีการอ่าน () ของ Javax.imageio.Imageio Class ถอดรหัสไฟล์ Grapefruit.jpg ที่แสดงในรูปที่ 1 และส่งคืนรูปภาพแคช
Image i = null;
รูปที่ 1. ไฟล์รูปภาพ struit.jpg
พิมพ์
รหัสนี้แสดงวิธีการพิมพ์ผืนผ้าใบที่มีอยู่คุณสามารถใช้วิธีการทาสีเพื่อปรับแต่งหน้าจอเริ่มต้นของเครื่องพิมพ์
PrinterJob PJ = PrinterJob.getPrinterJob (); ) .translate (pf.getimageablex (), pf.getimageabley ());
เสียงบี๊บ
รหัสต่อไปนี้แสดงวิธีการส่งเสียงบี๊บหากใช้วิธีการส่งเสียงบี๊บของคลาสเครื่องมือชุดเครื่องมือ
Toolkit TK = Toolkit.getDefaultToolkit ();
ตัวอย่างง่ายๆของการใช้โหมดหัวขาด
ตัวอย่าง HeadlessBasics ต่อไปนี้ใช้ฟังก์ชั่นทั้งหมดที่อธิบายไว้ในบทความ
ในการเรียกใช้ตัวอย่างนี้คุณต้องใช้ Javac เพื่อรวบรวมรหัสต่อไปนี้ คัดลอกไฟล์รูปภาพ grapefruit.jpg ไปยังไดเรกทอรีที่คลาส headlessbasics ตั้งอยู่
นำเข้า Java.awt.*; // เรียกสิ่งนี้ก่อนที่ชุดเครื่องมือจะเริ่มต้นนั่นคือ // ก่อนที่ Toolkit.getDefaultToolkit () ถูกเรียก สถานที่ให้บริการถูกตั้งค่าเป็นจริง // จะเป็น anstance ของหัวเรื่อง LKIT (); graphicsenvironment.getlocalgraphicsvirororonment (); ; อนุญาตให้ใช้งานได้ println ("ปุ่มถูกสร้างขึ้น:" ที่สร้างขึ้น); .Height -1); และแบบอักษร G.SetFont (ฟอนต์ใหม่ ("Arial", Font.italic, 12); G.DrawString ("ทดสอบ", 32, 8);}; // และการดำเนินการทั้งหมดทำงานได้อย่างถูกต้อง C.SetBounds (32, 32, 128, 128); .PrintStackTrace (System.err);} ภาพสุดท้าย im = i; (หน้าเว็บ> 0) {ret urn printable.no_such_page;} ((กราฟิก 2) g) .translate (pf.getimageablex (), pf.getimageable (); วาดภาพ z) {z.printstacktrace (System.err);}}}}}}}}รูปที่ 2 แสดงผลการพิมพ์ในตัวอย่างนี้
รูปที่ 2. headlessbasics เอาต์พุตพิมพ์
นอกจากนี้คุณสามารถดูข้อมูลต่อไปนี้:
HEADLESS MODE: TRUEJAVA.AWT.HEADLESSEXPECTIONAT JAVA.AWT.GRAPHICSENVIRONMENT.CHECKHEADLESS (แหล่งที่ไม่รู้จัก) ที่ Java.Awt.Window Java: 24) Frame ถูกสร้างขึ้น: FalseJava.head.headlessexception java.awt.graphicsenvalonment.checkheadless (แหล่งที่ไม่รู้จัก) t java.awt.button ถูกสร้างขึ้น: เท็จ
หมายเหตุ: เพื่อจุดประสงค์ของการสาธิตรหัสเริ่มต้นจะทำให้แอปพลิเคชันนี้โยน 2 java.awt.headlessexceptions ความผิดปกติ
เพื่อทดแทนวิธีก่อนหน้านี้คุณสามารถใส่ข้อมูลเอาต์พุตมาตรฐานลงในไฟล์และพิมพ์ไฟล์ ในกรณีนี้ให้ใช้บรรทัดคำสั่งต่อไปนี้เพื่อเรียกใช้ตัวอย่างนี้:
Java HeadlessBasics 2> Standard_Output.txt
แปลงแอปพลิเคชันที่มีอยู่เป็นโหมดหัวขาด
คุณจะแปลงแอปพลิเคชันที่มีอยู่ให้เป็นโหมดหัวเฮดเลสแบบปฏิบัติการได้อย่างไร วิธีที่มีประสิทธิภาพที่สุดในการดำเนินการแปลงนี้คือการวิเคราะห์ซอร์สโค้ดของคุณเพื่อพิจารณาว่าฟังก์ชั่นใด ๆ ขึ้นอยู่กับโหมดหัวขาด กล่าวอีกนัยหนึ่งในการรับรู้คุณสมบัติเดียวกันคุณต้องค้นหาคลาสและวิธีการที่จะโยนข้อยกเว้น HeadlessException จากนั้นใช้โหมดหัวขาดอิสระเพื่อแทนที่คลาสและวิธีการเหล่านี้
คุณสามารถใช้ Java SE 6 API เพื่ออธิบายเพื่อตรวจสอบว่าคลาสหรือวิธีการเฉพาะที่รองรับโหมด Headless หรือไม่ หากส่วนประกอบเฉพาะไม่รองรับโหมดหัวขาดความผิดปกติเพียงอย่างเดียวที่โปรแกรมของคุณต้องการการจับภาพคือหัวเรื่อง มันถูกโยนออกไปก่อนที่ความผิดปกติอื่น ๆ ที่เป็นไปได้ นี่คือเหตุผลที่ไม่มีความจำเป็นพิเศษในการจับภาพความผิดปกติอื่น ๆ ในตัวอย่างรหัสของส่วนนี้: ใช้โหมดหัวขาด "
คุณจะพบประโยชน์ของวิธีการที่เป็นประโยชน์อื่น ๆ อย่างแน่นอนในการใช้โหมดหัวขาด เราหวังว่าบทความนี้จะช่วยให้คุณทำงานนี้ให้สำเร็จและเล่นโลกใหม่บนแพลตฟอร์ม Java SE