成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在Java SE平臺(tái)上使用Headless模式

開(kāi)發(fā) 后端
哪里才能用到此模式呢?想想你的應(yīng)用不停的生成一張圖片,比如,當(dāng)用戶每次登陸系統(tǒng)是都要生成一張認(rèn)證圖片。當(dāng)創(chuàng)建圖片時(shí),你得應(yīng)用既不需要顯示器也不需要鍵盤(pán)。讓我們假設(shè)一下,現(xiàn)在你的應(yīng)用有個(gè)主架構(gòu)或者專有服務(wù)器,但這個(gè)服務(wù)沒(méi)有顯示器,鍵盤(pán)或者鼠標(biāo)。

這篇文章介紹怎樣在標(biāo)準(zhǔn)Java(Java SE,也稱作J2SE)平臺(tái)上用Headless模式。

Headless模式是在缺少顯示屏、鍵盤(pán)或者鼠標(biāo)時(shí)的系統(tǒng)配置。聽(tīng)起來(lái)不可思議,但事實(shí)上你可以在這中模式下完成不同的操作,甚至是用圖形數(shù)據(jù)也可以。

哪里才能用到此模式呢?想想你的應(yīng)用不停的生成一張圖片,比如,當(dāng)用戶每次登陸系統(tǒng)是都要生成一張認(rèn)證圖片。當(dāng)創(chuàng)建圖片時(shí),你得應(yīng)用既不需要顯示器也不需要鍵盤(pán)。讓我們假設(shè)一下,現(xiàn)在你的應(yīng)用有個(gè)主架構(gòu)或者專有服務(wù)器,但這個(gè)服務(wù)沒(méi)有顯示器,鍵盤(pán)或者鼠標(biāo)。理想的決定是用環(huán)境的大量視覺(jué)計(jì)算能力而不是非視覺(jué)特性。在Headless模式下生成的圖片可以傳遞到Headful系統(tǒng)進(jìn)行更深層次渲染。

在java.awt.toolkit和java.awt.graphicsenvironment 類中有許多方法,除了對(duì)字體,圖像和打印的操作外還有調(diào)用顯示器,鍵盤(pán)和鼠標(biāo)的方法。但是有一些類中,比如Canvas 和 Panel,可以在headless模式下執(zhí)行。在J2SE 1.4平臺(tái)之后就提供了對(duì)Headless模式的支持。

注:這篇文章重點(diǎn)講的是Java SE6 平臺(tái)版本的文檔。任何API增加或其他增強(qiáng)Java SE平臺(tái)的規(guī)范由JSR270專家組(JSR 270 Expert Group.)的審查和批準(zhǔn)

Toolkit

java.awt.Toolkit類是Abstract Window Toolkit (AWT)的 所有實(shí)現(xiàn)類的抽象父類。Toolkit的子類用于把各種AWT組件綁定到特定的本地toolkit實(shí)現(xiàn)上去。 

如果顯示設(shè)備,鍵盤(pán)或鼠標(biāo)不支持的話,很多組件都會(huì)受影響。一個(gè)合適的類構(gòu)造器應(yīng)當(dāng)拋出一個(gè)HeadlessException異常: 

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

這種重量級(jí)的組件需要有一個(gè)操作系統(tǒng)級(jí)別上對(duì)等的圖形函數(shù)來(lái)支持它,在headless的機(jī)器上它們將不能正常工作。 

與Canvas、Panel和Image組件相關(guān)的組件不需要拋出HeadlessException異常,因?yàn)檫@些組件在操作系統(tǒng)級(jí)別上的對(duì)等圖形函數(shù)可以使用空函數(shù),然后作為輕量級(jí)組件來(lái)處理。

一個(gè)Headless的toolkit也會(huì)把Java組件綁定到本地資源上去,但是它只有在資源中不包含顯示設(shè)備或輸入設(shè)備時(shí)才會(huì)這樣做。 

Graphics Environment

java.awt.GraphicsEnvironment類是一個(gè)抽象類,它描述了在給定平臺(tái)中,可以在Java技術(shù)中使用的由 GraphicsDevice對(duì)象和Font對(duì)象組成的集合。該GraphicsEnvironment中的資源可以是本地的也可以是遠(yuǎn)程設(shè)備。 GraphicsDevice對(duì)象可以是顯示器,打印機(jī)或者圖形緩存等,并且它們是Graphics2D 繪制函數(shù)的目標(biāo)。每一個(gè)GraphicsDevice都有許多與之關(guān)聯(lián)的GraphicsConfiguration對(duì)象。這些對(duì)象指定了不同的配置環(huán)境,在這些配置環(huán)境中可以使用GraphicsDevice。

Table 1 顯示GraphicsEnvironment 方法,檢查Headless模式支持

Table 1.  Headless 模式方法    

方法 描述

public static boolean
isHeadless()

測(cè)試環(huán)境是否為headless, 對(duì)于是否不支持display  device,keyboard,mouse。如果這個(gè)方法returns true,theToolkitandGraphicsEnvironmentclasses 拋出(thrown)依賴于display device, keyboard, mouse的aHeadlessExceptionis異常.

public boolean
isHeadlessInstance()

Returns  thisGraphicsEnvironmentcan 是否支持dieplay device,keyboard,mouse. 如果這個(gè)方法 returns  true,  theGraphicsEnvironmentthat 拋出(throw)一個(gè)依賴于 display device, keyboard, mouse的aHeadlessExceptionis 異常.

注意:isHeadless()方法檢查特定的系統(tǒng)屬性,java.awt.headless而不是系統(tǒng)的硬件配置. 

HeadlessException 拋出的代碼,這取決于display device、keyboard、mouse在一個(gè)環(huán)境稱為不支持任何這些.唯一的例外是來(lái)自一個(gè) UnsupportedOperationException,本身就是來(lái)源于一個(gè)RuntimeException.

設(shè)置Headless模式

使用Headless模式操作,您必須首先了解如何檢查和設(shè)置系統(tǒng)屬性與此相關(guān)的模式。此外,你必須了解如何創(chuàng)建一個(gè)默認(rèn)的工具包使用工具箱的無(wú)頭實(shí)現(xiàn)類.

系統(tǒng)屬性配置

為了啟用headless模式,需要使用setProperty()方法去設(shè)置相應(yīng)的系統(tǒng)屬性。本方法可以讓你用期望的值來(lái)設(shè)置系統(tǒng)屬性。

  1. System.setProperty("java.awt.headless""true"); 

上面的代碼中,java.awt.headless是一個(gè)系統(tǒng)屬性,true是我們?cè)O(shè)定的值。

如果你想在一個(gè)相同的程序中使用headless和傳統(tǒng)環(huán)境,你可以使用下面的命令行來(lái)完成:

  1. java -Djava.awt.headless=true   

創(chuàng)建默認(rèn)Toolkit

如果名字為java.awt.headless的系統(tǒng)屬性被設(shè)置為true,那么headless工具包就會(huì)被使用。接下來(lái)使用getDefaultToolkit()方法來(lái)創(chuàng)建一個(gè)headless toolkit的實(shí)例:

  1. Toolkit tk = Toolkit.getDefaultToolkit(); 

Headless模式檢查

要檢查Headless模式的可用性,使用GraphicsEnvironment類的isHeadless()方法:

  1. GraphicsEnvironment ge =  
  2. GraphicsEnvironment.getLocalGraphicsEnvironment();  
  3. boolean headless_check = ge.isHeadless(); 

該方法檢查java.awt.headless系統(tǒng)屬性。如果這個(gè)屬性有一個(gè)為true的值,那么就會(huì)從工具包和依賴于一個(gè)顯示器,鍵盤(pán),鼠標(biāo)的GraphicsEnvironment類的區(qū)域中拋出一個(gè)HeadlessException。
在Headless模式中操作

設(shè)置好headless模式并創(chuàng)建一個(gè)headless工具包的實(shí)例后,您的應(yīng)用程序可以執(zhí)行以下操作: 

  • 創(chuàng)建輕量級(jí)組件,如Canvas,Panel,和Swing組件,除了top級(jí)別.
  • 收集關(guān)于可用的字體、字體指標(biāo)和字體設(shè)置的信息
  • 設(shè)置顏色來(lái)渲染文本和圖形
  • 創(chuàng)造和獲取圖像,為渲染準(zhǔn)備圖片
  • 使用java.awt.PrintJob, java.awt.print.*, 和 javax.print.* 類進(jìn)行打印。
  • 發(fā)出"嗶嗶"音頻。

Canvas(畫(huà)布)

下面的代碼會(huì)在屏幕上繪制出一個(gè)空白的矩形區(qū)域,你可以在上面繪制線條。可以使用Canvas類創(chuàng)建一個(gè)新的Canvas組件。

  1. final Canvas c = new Canvas()  
  2. {  
  3.     public void paint(Graphics g)  
  4.     {  
  5.         Rectangle r = getBounds();  
  6.         g.drawLine(00, r.width - 1, r.height - 1);  
  7.         g.drawLine(0, r.height - 1, r.width - 10);  
  8.     }  
  9. }; 

Fonts(字體)

這段代碼顯示了怎么使用Font類畫(huà)一個(gè)文本字符串并設(shè)置文字的字體。Graphics對(duì)象是用來(lái)繪制這個(gè)字符串的。

  1. public void paint(Graphics g)  
  2. {  
  3.     g.setFont(new Font("Arial", Font.ITALIC, 12));  
  4.     g.drawString("Test"328);  
  5. }  

Colors

這段代碼顯示了如何使用指定的紅,綠,藍(lán)的值來(lái)設(shè)置一條線的顏色。Graphics對(duì)象是用來(lái)繪制這條線的。

  1. public void paint(Graphics g)  
  2. {  
  3.     g.setColor(new Color(2551270));  
  4.     g.drawLine(0, r.height - 1, r.width - 10);  

Images

在下面的代碼中,javax.imageio.ImageIO類的使用read()方法對(duì)圖1所示的grapefruit.jpg文件進(jìn)行解碼,并返回一個(gè)緩存圖片。

  1. Image i = null;  
  2. try 
  3. {  
  4.     File f = new File("grapefruit.jpg");  
  5.     i = ImageIO.read(f);  
  6. }  
  7. catch (Exception z)  
  8. {  
  9.     z.printStackTrace(System.err);  

圖1。grapefruit.jpg圖像文件

Print

這段代碼演示了如何打印已經(jīng)準(zhǔn)備好的畫(huà)布,你可以使用paint方法自定義打印機(jī)的的默認(rèn)畫(huà)面。

  1. PrinterJob pj = PrinterJob.getPrinterJob();  
  2. pj.setPrintable(new Printable()  
  3. {  
  4.    public int print(Graphics g, PageFormat pf, int pageIndex)  
  5.    {  
  6.        if (pageIndex > 0)  
  7.        {  
  8.            return Printable.NO_SUCH_PAGE;  
  9.        }  
  10.  
  11.        ((Graphics2D)g).translate(pf.getImageableX(),  
  12.                                  pf.getImageableY());  
  13.  
  14.        // Paint canvas.  
  15.        c.paint(g);  
  16.  
  17.        return Printable.PAGE_EXISTS;  
  18.    }  
  19. }); 

Beep

下面的這段代碼展示了如果使用 Toolkit類的beep方法發(fā)出嘟嘟聲。

  1. Toolkit tk = Toolkit.getDefaultToolkit();  
  2. tk.beep();  

 #p#

使用Headless模式簡(jiǎn)單例子

以下的HeadlessBasics例子運(yùn)用了文章中描述的所有功能。

要運(yùn)行這個(gè)的例子,需要用javac對(duì)下面的代碼進(jìn)行編譯。復(fù)制grapefruit.jpg圖片文件到HeadlessBasics類所在的目錄下面。

  1. import java.awt.*;  
  2. import java.io.*;  
  3. import java.awt.print.*;  
  4.  
  5. import javax.imageio.*;  
  6.  
  7. public class HeadlessBasics  
  8. {  
  9.     public static void main(String[] args)  
  10.     {  
  11.         // Set system property.  
  12.         // Call this BEFORE the toolkit has been initialized, that is,  
  13.         // before Toolkit.getDefaultToolkit() has been called.  
  14.         System.setProperty("java.awt.headless""true");  
  15.  
  16.         // This triggers creation of the toolkit.  
  17.         // Because java.awt.headless property is set to true, this  
  18.         // will be an instance of headless toolkit.  
  19.         Toolkit tk = Toolkit.getDefaultToolkit();  
  20.         // Standard beep is available.  
  21.         tk.beep();  
  22.  
  23.         // Check whether the application is  
  24.         // running in headless mode.  
  25.         GraphicsEnvironment ge =  
  26.         GraphicsEnvironment.getLocalGraphicsEnvironment();  
  27.         System.out.println("Headless mode: " + ge.isHeadless());  
  28.  
  29.         // No top levels are allowed.  
  30.         boolean created = false;  
  31.         try 
  32.         {  
  33.             Frame f = new Frame("Frame");  
  34.             created = true;  
  35.         }  
  36.         catch (Exception z)  
  37.         {  
  38.             z.printStackTrace(System.err);  
  39.             created = false;  
  40.         }  
  41.         System.err.println("Frame is created: " + created);  
  42.  
  43.         // No other components except Canvas and Panel are allowed.  
  44.         created = false;  
  45.         try 
  46.         {  
  47.             Button b = new Button("Button");  
  48.             created = true;  
  49.         }  
  50.         catch (Exception z)  
  51.         {  
  52.             z.printStackTrace(System.err);  
  53.             created = false;  
  54.         }  
  55.         System.err.println("Button is created: " + created);  
  56.           
  57.         // Canvases can be created.  
  58.         final Canvas c = new Canvas()  
  59.         {  
  60.             public void paint(Graphics g)  
  61.             {  
  62.                 Rectangle r = getBounds();  
  63.                 g.drawLine(00, r.width - 1, r.height - 1);  
  64.                 // Colors work too.  
  65.                 g.setColor(new Color(2551270));  
  66.                 g.drawLine(0, r.height - 1, r.width - 10);  
  67.                 // And fonts  
  68.                 g.setFont(new Font("Arial", Font.ITALIC, 12));  
  69.                 g.drawString("Test"328);  
  70.             }  
  71.         };  
  72.         // And all the operations work correctly.  
  73.         c.setBounds(3232128128);  
  74.  
  75.         // Images are available.  
  76.         Image i = null;  
  77.         try 
  78.         {  
  79.             File f = new File("grapefruit.jpg");  
  80.             i = ImageIO.read(f);  
  81.         }  
  82.         catch (Exception z)  
  83.         {  
  84.             z.printStackTrace(System.err);  
  85.         }  
  86.         final Image im = i;  
  87.           
  88.         // Print system is available.  
  89.         PrinterJob pj = PrinterJob.getPrinterJob();  
  90.         pj.setPrintable(new Printable()  
  91.         {  
  92.             public int print(Graphics g, PageFormat pf, int pageIndex)  
  93.             {  
  94.                 if (pageIndex > 0)  
  95.                 {  
  96.                     return Printable.NO_SUCH_PAGE;  
  97.                 }  
  98.                 ((Graphics2D)g).translate(pf.getImageableX(),  
  99.                                           pf.getImageableY());  
  100.  
  101.                 // Paint the canvas.  
  102.                 c.paint(g);  
  103.  
  104.                 // Paint the image.  
  105.                 if (im != null)  
  106.                 {  
  107.                     g.drawImage(im, 32326464null);  
  108.                 }  
  109.  
  110.                 return Printable.PAGE_EXISTS;  
  111.             }  
  112.         });  
  113.         try 
  114.         {  
  115.             pj.print();  
  116.         }  
  117.         catch (Exception z)  
  118.         {  
  119.             z.printStackTrace(System.err);  
  120.         }  
  121.     }  
  122. }  

圖2顯示了這個(gè)例子中的打印輸出結(jié)果

圖2。HeadlessBasics的打印輸出。

此外,你可以看到以下的信息:

  1. Headless mode: true 
  2. java.awt.HeadlessException  
  3. at java.awt.GraphicsEnvironment.checkHeadless(Unknown Source)  
  4. at java.awt.Window.<init>(Unknown Source)  
  5. at java.awt.Frame.<init>(Unknown Source)  
  6. at HeadlessBasics.main(HeadlessBasics.java:24)  
  7. Frame is created: false 
  8. java.awt.HeadlessException  
  9. at java.awt.GraphicsEnvironment.checkHeadless(Unknown Source)  
  10. at java.awt.Button.<init>(Unknown Source)  
  11. at HeadlessBasics.main(HeadlessBasics.java:39)  
  12. Button is created: false 

注:出于演示的目的,最初的代碼會(huì)導(dǎo)致此應(yīng)用程序拋出2個(gè)java.awt.HeadlessExceptions異常。

作為上一種方式的替代,你可以把標(biāo)準(zhǔn)輸出信息放到一個(gè)文件中,然后把文件打印出來(lái)。在這種情況下,使用下面的命令行來(lái)運(yùn)行這個(gè)例子:

java HeadlessBasics 2> standard_output.txt 

把現(xiàn)有的應(yīng)用程序轉(zhuǎn)換為Headless模式。

你怎么把現(xiàn)有的應(yīng)用程序轉(zhuǎn)換為可執(zhí)行的headless模式?要執(zhí)行此轉(zhuǎn)換的最有效的方法是分析你的源代碼以確定任何的功能都是依賴于Headless模式的。換句話說(shuō),要實(shí)現(xiàn)相同的功能,你必須找到那些會(huì)拋出HeadlessException異常的類和方法,然后使用獨(dú)立的headless模式替換這些類和方法。

你可以使用Java SE 6 API說(shuō)明來(lái)判斷一個(gè)特定的類或方法是否支持headless模式。如果一個(gè)特定的組件不支持headless模式,你的程序需要捕獲的唯一的異常是 HeadlessException。它會(huì)在其它可能的異常之前被拋出。這也是為什么在本節(jié)的代碼示例"舉例: 使用Headless模式"中,沒(méi)有什么特殊的必要性來(lái)捕獲其它異常。

你肯定會(huì)發(fā)現(xiàn)其它有用的方法來(lái)使用headless模式帶來(lái)的好處。我們希望本文能幫你完成此項(xiàng)任務(wù),在Java SE平臺(tái)中玩出一片新天地。 

獲取更多信息 

AWT Enhancements in J2SE 1.4: Headless Support

J2SE 1.4 platform documentation: HeadlessException

The New Modality API in Java SE 6

The java.awt.Toolkit Class

The java.awt.GraphicsEnvironment Class

關(guān)于作者 

Artem Ananiev 是位于 Saint Petersburg的Sun Microsystems公司的一名軟件工程師,俄羅斯人。之前他曾經(jīng)在Abstract Window Toolkit (AWT) 項(xiàng)目中工作過(guò)幾年,他主要的技能領(lǐng)域是模態(tài),機(jī)器人和多屏系統(tǒng)。 

Alla Redko  是位于 Saint Petersburg的 Sun Microsystems公司的技術(shù)作者,俄羅斯人。她為AWT項(xiàng)目編寫(xiě)技術(shù)文檔,并且負(fù)責(zé)更新Java用戶手冊(cè)。在到Sun任職之前,她已經(jīng)作為技術(shù)作者工作了八年。

英文原文:Using Headless Mode in the Java SE Platform

譯文鏈接:http://www.oschina.net/translate/using-headless-mode-in-java-se

責(zé)任編輯:林師授 來(lái)源: OSCHINA編譯
相關(guān)推薦

2017-03-20 17:20:35

iOSTensorFlow

2012-04-25 14:27:03

JavaScala

2012-04-25 14:12:12

JavaScala

2010-06-09 17:46:53

2011-07-28 15:07:23

iOS猜數(shù)游戲

2010-05-19 16:53:31

MySQL代碼

2012-04-26 13:37:43

ScalaJavaQCon

2017-02-23 13:51:05

2009-01-16 09:10:39

JavaCRM系統(tǒng)企業(yè)應(yīng)用

2015-07-08 11:28:53

云服務(wù)平臺(tái)Docker MachDocker

2019-06-19 16:05:51

AppImageFlathubLinux

2020-02-18 09:45:44

云計(jì)算云平臺(tái)IT

2011-08-23 09:16:19

Python

2012-08-22 11:12:11

Ubuntu

2017-01-13 16:29:35

華為助力云平臺(tái)

2019-10-09 08:00:17

Kubernetes容器云平臺(tái)

2025-04-23 15:49:37

2009-02-23 20:21:40

系統(tǒng)分析師論文寫(xiě)作XML

2010-08-26 11:54:47

DB2安裝Linux

2009-06-30 15:39:05

JSP虛擬主機(jī)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 性一交一乱一透一a级 | 久久久久国产精品午夜一区 | 国产99久久精品一区二区永久免费 | 精品欧美黑人一区二区三区 | 亚洲精品乱码久久久久久按摩观 | 久久久久一区 | 亚洲+变态+欧美+另类+精品 | 国产成人精品久久二区二区91 | 久久综合一区 | 久久r免费视频 | 亚洲人成人一区二区在线观看 | 午夜精品久久久 | 亚洲视频一区在线 | 一久久久| 国产午夜亚洲精品不卡 | 国产高清免费 | 久草视频观看 | 国内久久精品 | 国产成人网 | www.4虎影院 国产999精品久久久影片官网 | 国产欧美精品一区 | 国内自拍偷拍一区 | 欧美视频一区二区三区 | 国产精品国产a | 日韩一区二区三区视频 | 亚洲自拍一区在线观看 | 狠狠涩 | 成人在线视频网站 | 国产专区免费 | 欧美a区 | 日韩精品av一区二区三区 | 亚洲色图插插插 | 中文字幕在线不卡 | 色99视频 | 亚洲一区二区三区四区五区中文 | 欧美亚洲高清 | 91免费在线视频 | 色约约视频 | 亚洲天堂一区二区 | 中文字幕在线观看一区二区 | 欧美一级久久 |