亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

在Java SE上使用Headless模式的超級指南

2019-11-26 15:06:19
字體:
來源:轉載
供稿:網友

 這篇文章介紹怎樣在標準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異常:

  •     Button
  •     Checkbox
  •     Choice
  •     Dialog
  •     FileDialog
  •     Frame
  •     Label
  •     List
  •     Menu
  •     MenuBar
  •     MenuItem
  •     PopupMenu
  •     Scrollbar
  •     ScrollPane
  •     TextArea
  •     TextField
  •     Window

這種重量級的組件需要有一個操作系統級別上對等的圖形函數來支持它,在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 模式方法   

2015710114950353.jpg (782×202)

注意: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,Panel,和Swing組件,除了top級別.
  •     收集關于可用的字體、字體指標和字體設置的信息
  •     設置顏色來渲染文本和圖形
  •     創造和獲取圖像,為渲染準備圖片
  •     使用java.awt.PrintJob, java.awt.print.*, 和 javax.print.* 類進行打印。
  •     發出"嗶嗶"音頻。

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圖像文件

Print

這段代碼演示了如何打印已經準備好的畫布,你可以使用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: truejava.awt.HeadlessExceptionat 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: falsejava.awt.HeadlessExceptionat 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平臺中玩出一片新天地。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产久精国产一老狼| 久久久精品国产亚洲| 精品一区二区三区三区| 92看片淫黄大片欧美看国产片| 亚洲精品v天堂中文字幕| 欧美日韩福利视频| 亚洲精品国产电影| 欧美成人精品一区二区三区| 亚洲图中文字幕| 欧美又大粗又爽又黄大片视频| 欧美成在线观看| 欧美老女人在线视频| 日韩电影在线观看永久视频免费网站| 国产成人免费av| 狠狠色噜噜狠狠狠狠97| 伊人久久综合97精品| 在线精品视频视频中文字幕| 亚洲大胆人体av| 久久国产精品久久精品| 精品久久久久久| 亚洲国产精品美女| 日韩中文字幕视频在线观看| 久久久久北条麻妃免费看| 亚洲黄色成人网| 亚洲va国产va天堂va久久| 高清欧美电影在线| 国产成人精品免高潮在线观看| 欧美色图在线视频| 亚洲欧美国产制服动漫| 国产精品aaaa| 91免费视频国产| 欧美一区二区影院| 超碰精品一区二区三区乱码| 亚洲欧美激情在线视频| 国产精品青草久久久久福利99| 成人情趣片在线观看免费| 91久久精品国产91久久性色| 欧美激情亚洲另类| 亚洲成avwww人| 精品国产999| 日韩中文综合网| 中文字幕日韩在线视频| 亚洲资源在线看| 国产精品久久999| 青青精品视频播放| 色综合久久88色综合天天看泰| 国产精品夜色7777狼人| 亚洲精品网站在线播放gif| 青草青草久热精品视频在线观看| 亚洲偷熟乱区亚洲香蕉av| 国产精品96久久久久久| **欧美日韩vr在线| 欧美日本在线视频中文字字幕| 亚洲人成毛片在线播放| 国产在线观看不卡| 国产亚洲欧美日韩精品| 亚洲欧美国产一本综合首页| 欧美激情日韩图片| 亚洲激情成人网| 国产成人一区二区| 中文字幕在线看视频国产欧美在线看完整| 精品香蕉一区二区三区| 中文字幕自拍vr一区二区三区| 性日韩欧美在线视频| 日韩精品免费看| 国产精品视频免费在线观看| 亚洲精品v欧美精品v日韩精品| 91精品国产91久久久久久久久| 欧美一区二三区| 中文字幕欧美在线| 国产精品视频xxx| 成人精品久久久| 美日韩精品免费观看视频| 日韩电影免费在线观看中文字幕| 亚洲最大的成人网| 亚洲精品美女久久| 日韩人体视频一二区| 亚洲第一区中文字幕| 久久777国产线看观看精品| 日韩中文字幕在线| 亚洲91av视频| 久久九九免费视频| 欧美又大又硬又粗bbbbb| 国产aⅴ夜夜欢一区二区三区| 欧美国产精品va在线观看| 欧美黑人xxx| 91国产精品91| 亚洲欧美综合v| 久久久久女教师免费一区| 91精品国产91久久久久久不卡| 国产精品一区二区av影院萌芽| 亚洲最大av网| 日本三级久久久| 色婷婷综合久久久久中文字幕1| 在线看片第一页欧美| 亚洲成人久久网| 91av视频在线播放| 国产成人jvid在线播放| 91手机视频在线观看| 中文字幕精品在线| 久久人人看视频| 最近2019年日本中文免费字幕| 亚洲自拍小视频| 国产中文欧美精品| 亚洲va久久久噜噜噜久久天堂| 91高潮精品免费porn| 欧美激情综合色综合啪啪五月| 成人精品久久av网站| 最新国产精品拍自在线播放| 日本高清视频一区| 欧美丝袜第一区| 日韩av在线看| 成人亚洲欧美一区二区三区| 亚洲热线99精品视频| 色婷婷亚洲mv天堂mv在影片| 国产视频观看一区| 国产91精品不卡视频| 91精品久久久久久久久久| 欧美精品少妇videofree| 中文一区二区视频| 国产丝袜一区二区三区免费视频| 成人激情视频在线| 精品一区二区电影| 国内精品久久久久久影视8| 97视频在线观看视频免费视频| 姬川优奈aav一区二区| 成人免费视频在线观看超级碰| 成人精品一区二区三区电影免费| 亚洲在线观看视频网站| 亚洲美女免费精品视频在线观看| 隔壁老王国产在线精品| 国产精品99久久99久久久二8| 日韩经典中文字幕在线观看| 国产精品久久久久7777婷婷| 5252色成人免费视频| 啪一啪鲁一鲁2019在线视频| 亚洲人成免费电影| 日韩大陆毛片av| 中文字幕9999| 日韩影视在线观看| 97在线视频精品| 欧美午夜宅男影院在线观看| 色综合久久悠悠| 日韩欧美国产高清91| 国产亚洲欧美视频| 成人444kkkk在线观看| 日韩亚洲一区二区| 久久在精品线影院精品国产| 午夜精品久久久久久久白皮肤| 亚洲精品久久久久国产| 一区二区三区视频免费| 668精品在线视频| 欧美性猛交xxxx乱大交| 九九综合九九综合| 国产伦精品免费视频| 成人性生交xxxxx网站| 日韩欧美a级成人黄色| 日韩欧美国产黄色| 中文字幕欧美精品日韩中文字幕| 亚洲精品第一国产综合精品| 久久精品久久精品亚洲人| 日韩av中文在线| 亚洲一区二区三区久久| 国产精品露脸av在线|