在Java SE上應用Headless形式的超等指南。本站提示廣大學習愛好者:(在Java SE上應用Headless形式的超等指南)文章只能為提供參考,不一定能成為您想要的結果。以下是在Java SE上應用Headless形式的超等指南正文
這篇文章引見如何在尺度Java(Java SE,也稱作J2SE)平台上用Headless形式。
Headless形式是在缺乏顯示屏、鍵盤或許鼠標時的體系設置裝備擺設。聽起來弗成思議,但現實上你可以在這中形式下完成分歧的操作,乃至是用圖形數據也能夠。
哪裡能力用到此形式呢?想一想你的運用一直的生成一張圖片,好比,當用戶每次上岸體系是都要生成一張認證圖片。當創立圖片時,你得運用既不須要顯示器也不須要鍵盤。讓我們假定一下,如今你的運用有個主架構或許專有辦事器,但這個辦事沒有顯示器,鍵盤或許鼠標。幻想的決議是用情況的年夜量視覺盤算才能而不長短視覺特征。在Headless形式下生成的圖片可以傳遞到Headful體系停止更深條理襯著。
在java.awt.toolkit和java.awt.graphicsenvironment類中有很多辦法,除對字體,圖象和打印的操作外還有挪用顯示器,鍵盤和鼠標的辦法。然則有一些類中,好比Canvas 和 Panel,可以在headless形式下履行。在J2SE 1.4平台以後就供給了對Headless形式的支撐。
注:這篇文章重點講的是Java SE6 平台版本的文檔。任何API的增長或其他加強Java SE平台的標准是由JSR270專家組(JSR 270 Expert Group.)的審查和同意。
Toolkit
java.awt.Toolkit類是Abstract Window Toolkit (AWT)的 一切完成類的籠統父類。Toolkit的子類用於把各類AWT組件綁定到特定的當地toolkit完成上去。
假如顯示裝備,鍵盤或鼠標不支撐的話,許多組件都邑受影響。一個適合的類結構器應該拋出一個HeadlessException異常:
這類分量級的組件須要有一個操作體系級別上對等的圖形函數來支撐它,在headless的機械上它們將不克不及正常任務。
與Canvas、Panel和Image組件相干的組件不須要拋出HeadlessException異常,由於這些組件在操作體系級別上的對等圖形函數可使用空函數,然後作為輕量級組件來處置。
一個Headless的toolkit也會把Java組件綁定到當地資本上去,然則它只要在資本中不包括顯示裝備或輸出裝備時才會如許做。
Graphics Environment
java.awt.GraphicsEnvironment類是一個籠統類,它描寫了在給定平台中,可以在Java技巧中應用的由GraphicsDevice對象和Font對象構成的聚集。該GraphicsEnvironment中的資本可所以當地的也能夠是長途裝備。GraphicsDevice對象可所以顯示器,打印機或許圖形緩存等,而且它們是Graphics2D 繪制函數的目的。每個GraphicsDevice都有很多與之聯系關系的GraphicsConfiguration對象。這些對象指定了分歧的設置裝備擺設情況,在這些設置裝備擺設情況中可使用GraphicsDevice。
Table 1 顯示GraphicsEnvironment 辦法,檢討Headless形式支撐
Table 1. Headless 形式辦法
留意:isHeadless()辦法檢討特定的體系屬性,java.awt.headless而不是體系的硬件設置裝備擺設.
HeadlessException 拋出的代碼,這取決於display device、keyboard、mouse在一個情況稱為不支撐任何這些.獨一的破例是來自一個UnsupportedOperationException,自己就是起源於一個RuntimeException.
設置 Headless形式
應用Headless形式操作,您必需起首懂得若何檢討和設置體系屬性與此相干的形式。另外,你必需懂得若何創立一個默許的對象包應用對象箱的無頭完成類.
體系屬性設置裝備擺設
為了啟用headless形式,須要應用setProperty()辦法去設置響應的體系屬性。本辦法可讓你用希冀的值來設置體系屬性。
System.setProperty("java.awt.headless", "true");
下面的代碼中,java.awt.headless是一個體系屬性,true是我們設定的值。
假如你想在一個雷同的法式中應用headless和傳統情況,你可使用上面的敕令行來完成:
java -Djava.awt.headless=true
創立默許Toolkit
假如名字為java.awt.headless的體系屬性被設置為true,那末headless對象包就會被應用。接上去應用getDefaultToolkit()辦法來創立一個headless toolkit的實例:
Toolkit tk = Toolkit.getDefaultToolkit();
Headless形式檢討
要檢討Headless形式的可用性,應用GraphicsEnvironment類的isHeadless()辦法:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); boolean headless_check = ge.isHeadless();
該辦法檢討java.awt.headless體系屬性。假如這個屬性有一個為true的值,那末就會從對象包和依附於一個顯示器,鍵盤,鼠標的GraphicsEnvironment類的區域中拋出一個HeadlessException。
在Headless形式中操作
設置好headless形式並創立一個headless對象包的實例後,您的運用法式可以履行以下操作:
Canvas(畫布)
上面的代碼會在屏幕上繪制出一個空白的矩形區域,你可以在下面繪制線條。可使用Canvas類創立一個新的Canvas組件。
final Canvas c = new Canvas() { public void paint(Graphics g) { Rectangle r = getBounds(); g.drawLine(0, 0, r.width - 1, r.height - 1); g.drawLine(0, r.height - 1, r.width - 1, 0); } };
Fonts(字體)
這段代碼顯示了怎樣應用Font類畫一個文本字符串並設置文字的字體。Graphics對象是用來繪制這個字符串的。
public void paint(Graphics g) { g.setFont(new Font("Arial", Font.ITALIC, 12)); g.drawString("Test", 32, 8); }
Colors
這段代碼顯示了若何應用指定的紅,綠,藍的值來設置一條線的色彩。Graphics對象是用來繪制這條線的。
public void paint(Graphics g) { g.setColor(new Color(255, 127, 0)); g.drawLine(0, r.height - 1, r.width - 1, 0); }
Images
鄙人面的代碼中,javax.imageio.ImageIO類的應用read()辦法對圖1所示的grapefruit.jpg文件停止解碼,並前往一個緩存圖片。
Image i = null; try { File f = new File("grapefruit.jpg"); i = ImageIO.read(f); } catch (Exception z) { z.printStackTrace(System.err); }
圖1。grapefruit.jpg圖象文件
這段代碼演示了若何打印曾經預備好的畫布,你可使用paint辦法自界說打印機的的默許畫面。
PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPrintable(new Printable() { public int print(Graphics g, PageFormat pf, int pageIndex) { if (pageIndex > 0) { return Printable.NO_SUCH_PAGE; } ((Graphics2D)g).translate(pf.getImageableX(), pf.getImageableY()); // Paint canvas. c.paint(g); return Printable.PAGE_EXISTS; } });
Beep
上面的這段代碼展現了假如應用 Toolkit類的beep辦法收回嘟嘟聲。
Toolkit tk = Toolkit.getDefaultToolkit(); tk.beep();
應用Headless形式簡略例子
以下的HeadlessBasics例子應用了文章中描寫的一切功效。
要運轉這個的例子,須要用javac對上面的代碼停止編譯。復制grapefruit.jpg圖片文件到HeadlessBasics類地點的目次上面。
import java.awt.*; import java.io.*; import java.awt.print.*; import javax.imageio.*; public class HeadlessBasics { public static void main(String[] args) { // Set system property. // Call this BEFORE the toolkit has been initialized, that is, // before Toolkit.getDefaultToolkit() has been called. System.setProperty("java.awt.headless", "true"); // This triggers creation of the toolkit. // Because java.awt.headless property is set to true, this // will be an instance of headless toolkit. Toolkit tk = Toolkit.getDefaultToolkit(); // Standard beep is available. tk.beep(); // Check whether the application is // running in headless mode. GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); System.out.println("Headless mode: " + ge.isHeadless()); // No top levels are allowed. boolean created = false; try { Frame f = new Frame("Frame"); created = true; } catch (Exception z) { z.printStackTrace(System.err); created = false; } System.err.println("Frame is created: " + created); // No other components except Canvas and Panel are allowed. created = false; try { Button b = new Button("Button"); created = true; } catch (Exception z) { z.printStackTrace(System.err); created = false; } System.err.println("Button is created: " + created); // Canvases can be created. final Canvas c = new Canvas() { public void paint(Graphics g) { Rectangle r = getBounds(); g.drawLine(0, 0, r.width - 1, r.height - 1); // Colors work too. g.setColor(new Color(255, 127, 0)); g.drawLine(0, r.height - 1, r.width - 1, 0); // And fonts g.setFont(new Font("Arial", Font.ITALIC, 12)); g.drawString("Test", 32, 8); } }; // And all the operations work correctly. c.setBounds(32, 32, 128, 128); // Images are available. Image i = null; try { File f = new File("grapefruit.jpg"); i = ImageIO.read(f); } catch (Exception z) { z.printStackTrace(System.err); } final Image im = i; // Print system is available. PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPrintable(new Printable() { public int print(Graphics g, PageFormat pf, int pageIndex) { if (pageIndex > 0) { return Printable.NO_SUCH_PAGE; } ((Graphics2D)g).translate(pf.getImageableX(), pf.getImageableY()); // Paint the canvas. c.paint(g); // Paint the image. if (im != null) { g.drawImage(im, 32, 32, 64, 64, null); } return Printable.PAGE_EXISTS; } }); try { pj.print(); } catch (Exception z) { z.printStackTrace(System.err); } } }
圖2顯示了這個例子中的打印輸入成果。
圖2。HeadlessBasics的打印輸入。
另外,你可以看到以下的信息:
Headless mode: true java.awt.HeadlessException at java.awt.GraphicsEnvironment.checkHeadless(Unknown Source) at java.awt.Window.<init>(Unknown Source) at java.awt.Frame.<init>(Unknown Source) at HeadlessBasics.main(HeadlessBasics.java:24) Frame is created: false java.awt.HeadlessException at java.awt.GraphicsEnvironment.checkHeadless(Unknown Source) at java.awt.Button.<init>(Unknown Source) at HeadlessBasics.main(HeadlessBasics.java:39) Button is created: false
注:出於演示的目標,最後的代碼會招致此運用法式拋出2個java.awt.HeadlessExceptions異常。
作為上一種方法的替換,你可以把尺度輸入信息放到一個文件中,然後把文件打印出來。在這類情形下,應用上面的敕令行來運轉這個例子:
java HeadlessBasics 2> standard_output.txt
把現有的運用法式轉換為Headless形式。
你怎樣把現有的運用法式轉換為可履行的headless形式?要履行此轉換的最有用的辦法是剖析你的源代碼以肯定任何的功效都是依附於Headless形式的。換句話說,要完成雷同的功效,你必需找到那些會拋出HeadlessException異常的類和辦法,然後應用自力的headless形式調換這些類和辦法。
你可使用Java SE 6 API解釋來斷定一個特定的類或辦法能否支撐headless形式。假如一個特定的組件不支撐headless形式,你的法式須要捕捉的獨一的異常是HeadlessException。它會在其它能夠的異常之前被拋出。這也是為何在本節的代碼示例"舉例: 應用Headless形式"中,沒有甚麼特別的需要性來捕捉其它異常。
你確定會發明其它有效的辦法來應用headless形式帶來的利益。我們願望本文能幫你完成此項義務,在Java SE平台中玩出一片新寰宇。