亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? jdk1.3 中的本地繪制支持.txt

?? 含有許多JAVA的技巧!
?? TXT
字號:
JDK1.3 中的本地繪制支持 
(加入日期:2001-5-6 點擊數:735)
【對此文發表評論】 【編程愛好者論壇】 【保存文章至硬盤】 【打印文章】 
 
在 JDK1.3 出現以前,您僅能將 Java 本地接口用于非用戶界面的工作。JDK 1.3 引入了新的 Java 2 AWT 本地接口,這使您可以在 Java 程序中使用非 Java 的 GUI 組件,盡管這樣做會失去純 Java 解決方案的可移植性。在使用 J2AWT 時,您必須針對要使用它的每個平臺制作本地動態連接庫或共享庫。 
下面這段話摘自 JDK1.3 的某個頭文件,它說明了這種新的 API 的開發背景及原因: 


AWT 支持使用本地 C 或 C++ 應用程序訪問 AWT 的本地結構。這是為了便于將原有的 C 或 C++ 應用程序移植到 Java 并滿足需要 ... [這些應用程序] 出于性能方面的原因在畫布上自行進行本地繪制 
在 JDK1.3 以前,Java 編程沒有明確的方法來訪問基層的同等 GUI 組件的句柄。在 JDK 1.3 中, Sun 公司創建了一種標準機制,通過這種機制,開發人員可以使本地 GUI 應用程序和庫在 Java AWT Canvas 對象中進行繪制。這意味著現在有一種正式的、有保證的方法來獲得支持這一功能的信息。當 JDK 1.3 與其他操作平臺對接時,所有的接口都提供相同的信息 -- 而不管使用的是什么系統。JDK 1.3 的 Windows 版本和 Solaris 版本是首先提供這種支持的實現。 

Sun 公司引入這一功能組件有幾方面的原因。首先, JDK 1.3 使得人們可以將依賴第三方產品的復雜原有軟件移植到 Java 上,而不必等到第三方產品本身完成移植以后。第二個原因即性能;如果本地的 GUI 代碼經過人們長時期的努力得到優化,則原樣保留這些軟件具有重要的商業價值。 

在本文中,我將介紹一些該功能部件的基本概念。我將逐步開發一個窗口小部件樣例,該窗口小部件使用Win32 API 進行繪制。下圖是最終的窗口小部件的快照,一個帶有笑臉的圓形窗口。 



運行中的窗口小部件


分步概覽
第一步,定義一個 Java 類 -- 比如說,Mywindow -- 使其繼承 Canvas 類并重載 paint 方法。您使用 paint 方法執行 AWT 對象的繪制操作,并在覆蓋該方法時加上 native 關鍵字。覆蓋方法使您能夠使用自己的本地代碼。您必須構建自己的本地代碼并把它編譯成一個動態連接庫,就像我們處理其他的 Java 本地接口應用程序一樣,在本例中,我們將調用 MyWindow.DLL 庫。在 Solaris 和 Linux 上則為共享對象或共享庫。您還需要用 System.loadLibrary("MyWindow") 調用將 MyWindow.DLL 庫加載到您的名為 MyWindow 的 Java 類中。 

完成這一示例需要二個部分:其一是 MyWindow.Java ,它提供 Canvas 類的子類,其二是 MyWindow.CPP ,它包含基于 Java 本地接口的繪制子程序的入口點。 在參考資源部分可找到 MyWindow.Java、MyWindow.CPP 及自動執行編譯的批處理文件 BUILD.BAT。 

第一步: 創建 MyWindow Java 類 
J2AWT 用于這種方法時有一個主要的局限性:本地代碼只能對 java.awt.Canvas 類的子類進行操作。這正是 MyWindow 繼承 Canvas 類的原因。在 Java 應用程序中,您可以像使用 Canvas 的其它子類那樣使用 MyWindow;在本例中,我將 MyWindow 添加到 Jwindow 中。 

import java.awt.*;
import javax.swing.*;

public class MyWindow extends Canvas {
        static {
                //加載包含 paint 代碼的庫。
                System.loadLibrary("MyWindow");
        }

        //繪制操作的本地入口點
        public native void paint(Graphics g);

        public static void main( String[] argv ){
                Frame f = new Frame();
                f.setSize(300,400);

                JWindow w = new JWindow(f);
                w.setBackground(new Color(0,0,0,255));
                w.getContentPane().setBackground(new Color(0,0,0,255));
                w.getContentPane().add(new MyWindow());
                w.setBounds(300,300,300,300);
                w.setVisible(true);
        }
}


請注意:您是在靜態塊中加載 MyWindow.DLL。這正是 Java 應用程序訪問本地代碼的方式。(我稍候就會開發這段本地代碼。)同時還應注意:paint 方法是用 native 關鍵字聲明的,并且沒有提供任何實現;這樣做是為了讓虛擬機知道,應該從在靜態塊中加載的動態連接庫中調用該本地方法。 

第二步:生成該類的 JNI 頭文件
要為以上定義的類生成 Java 本地接口頭文件,需使用 javah MyWindow.class 命令。首先應確保這個類文件在您的 CLASSPATH 中。以下是所生成的 MyWindow.h 的一部分,給出了函數聲明。 

/*
* Class: MyWindow
* Method: paint
* Signature: (Ljava/awt/Graphics;)V
*/
JNIEXPORT void JNICALL Java_MyWindow_paint
  (JNIEnv *, jobject, jobject);


第三步:開發完整的 MyWindow.CPP
以下是完整的 MyWindow.CPP,其中包含 MyWindow.Java 中所需要的繪圖程序的本地代碼。 

#include <windows.h>
#include <assert.h>
#include "jawt_md.h"
#include "MyWindow.h"

#define X(x) (int)(xLeft + (x)*xScale/100) // 縮放宏
#define Y(y) (int)(yTop + (y)*yScale/100) // 以使尺度在 0-100 之間
#define CX(x) (int)((x)*xScale/100)
#define CY(y) (int)((y)*yScale/100)

void DrawSmiley(HWND hWnd, HDC hdc);
HRGN hrgn = NULL;

JNIEXPORT void JNICALL
Java_MyWindow_paint(JNIEnv* env, jobject canvas, jobject graphics)
{
        JAWT awt;
        JAWT_DrawingSurface* ds;
        JAWT_DrawingSurfaceInfo* dsi;
        JAWT_Win32DrawingSurfaceInfo* dsi_win;
        jboolean result;
        jint lock;

        // 獲取 AWT 
        awt.version = JAWT_VERSION_1_3;
        result = JAWT_GetAWT(env, &awt);
        assert(result != JNI_FALSE);
        // 獲取繪圖界面
        ds = awt.GetDrawingSurface(env, canvas);
        if(ds == NULL)
            return;
        // 鎖定繪圖表面
        lock = ds->Lock(ds);
        assert((lock & JAWT_LOCK_ERROR) == 0);

        // 獲取繪圖表面的信息
        dsi = ds->GetDrawingSurfaceInfo(ds);

        // 獲取特定平臺的繪圖信息
        dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;

        HDC hdc = dsi_win->hdc;
        HWND hWnd = dsi_win->hwnd;
        //////////////////////////////
        // !!! 在此處進行繪圖 !!! //
        //////////////////////////////
        if(hrgn == NULL)
        {
                RECT rcBounds;
                GetWindowRect(hWnd,&rcBounds);
                long xLeft = 0; // 用于縮放宏
                long yTop = 0;
                long xScale = rcBounds.right-rcBounds.left;
                long yScale = rcBounds.bottom-rcBounds.top;
                hrgn = CreateEllipticRgn(X(10), Y(15), X(90), Y(95));
                SetWindowRgn(GetParent(hWnd),hrgn,TRUE);
                InvalidateRect(hWnd,NULL,TRUE);
        } else {
                DrawSmiley(hWnd,hdc);
        }
        // 釋放繪圖表面的信息
        ds->FreeDrawingSurfaceInfo(dsi);
        // 為繪圖表面解鎖
        ds->Unlock(ds);
        // 釋放繪圖表面
        awt.FreeDrawingSurface(ds);
}

void DrawSmiley(HWND hWnd, HDC hdc)
{
        RECT rcBounds;
        GetWindowRect(hWnd,&rcBounds);
        long xLeft = 0; // 用于縮放宏
        long yTop = 0;
        long xScale = rcBounds.right-rcBounds.left;
        long yScale = rcBounds.bottom-rcBounds.top;

        // 基于控制大小的畫筆寬度
        int iPenWidth = max(CX(5), CY(5));
        HBRUSH brushBlack;
        HBRUSH brushYellow;
        HPEN penBlack = CreatePen(PS_SOLID, iPenWidth, RGB(0x00,0x00,0x00));
        // 用于繪制填充橢圓的空畫筆
        HPEN penNull = CreatePen(PS_NULL, 0, (COLORREF)0);

        brushBlack = CreateSolidBrush(RGB(0x00,0x00,0x00));
        brushYellow = CreateSolidBrush(RGB(0xff,0xff,0x00));

        HPEN pPenSave = (HPEN)SelectObject(hdc, penBlack);
        HBRUSH pBrushSave = (HBRUSH)SelectObject(hdc,brushYellow);
        Ellipse(hdc,X(10), Y(15), X(90), Y(95)); // 頭部

        Arc(hdc,X(25), Y(10), X(75), Y(80), // 嘴部(微笑)
           X(35), Y(70), X(65), Y(70));

        SelectObject(hdc,&penNull); // 無繪圖寬度
        SelectObject(hdc,&brushBlack);

        Ellipse(hdc,X(57), Y(35), X(65), Y(50));
        Ellipse(hdc,X(35), Y(35), X(43), Y(50)); // 右眼
        Ellipse(hdc,X(46), Y(50), X(54), Y(65)); // 鼻子

        SetBkMode(hdc,TRANSPARENT); // 使用前景顏色

        SelectObject(hdc,pBrushSave);
        SelectObject(hdc,pPenSave);
}


這里的關鍵數據結構是 JAWT,它是在 jawt.h 中定義的(通過 jawt_md.h 包含在內)。它使程序可以訪問本地代碼在基于 Java 的 GUI 組件上繪圖所需的所有信息。本地方法的第一部分是套式:置入 JAWT 結構,獲得一個 JAWT_Win32DrawingSurfaceInfo 結構,鎖定表面(請一次只使用一種繪圖工具!),然后,獲取一個 JAWT_DrawingSurfaceInfo 結構,該結構包含特定平臺下繪圖所必需的指針(在 platformInfo字段中)。它也包含繪圖界面的矩形界限框及當前剪切區域。有關詳細信息,請查看 jawt.h 和 jawt_md.h (請參閱下面標題為 “構建環境”的部分)。 

Java_MyWindow_paint 是一個入口點,JVM 通過調用它來繪制 MyWindow。輔助函數 DrawSmiley 使用 Win32 調用來完成實際的繪制工作。要在您的應用程序中包含 GetDrawingSurfaceInfo,請使用外部庫 jawt.lib(請參閱 “構建環境”)。 

第四步:編輯 BUILD.BAT
在運行 BUILD.BAT 之前首先對它進行編輯,并像如下所示的那樣,為您的 Visual C++ 及 JDK1.3 設置路徑。BUILD.BAT 對 MyWindow.java 進行編譯,生成 MyWindow.h,然后將 MyWindow.CPP 編譯為 MyWindow.DLL。 

SET DEVSTUDIO=D:\Program Files\Microsoft Visual Studio\VC98
SET JDK13=D:\JDK1.3


好了,一切準備就緒。在運行該樣例之前,請確保 MyWindow.DLL、\JDK1.3\BIN 及 \JDK1.3\JRE\BIN 都在 PATH 內,還要保證當前目錄在 CLASSPATH 中;這將確保 MyWindow.class 會被成功加載。在確信 PATH 和 CLASSPATH 都設置妥當后,在命令行輸入 java MyWindow 來運行此應用程序。為方便您的使用,window.zip 中包含了一個批處理文件 RUN.BAT(請參閱參考資源)。要為 JDK 1.3 設置PATH 和 CLASSPATH,請編輯 RUN.BAT。 

構建環境


頭文件:在 JDK 的 include 目錄中新增了專用于 Windows 的 C 頭文件。它們是: 
  include/jawt.h.
  include/win32/jawt_md.h.


依據 JavaSoft 網站的說明,這些頭文件并不是 Java 2 平臺正式規范的組成部分;提供這些頭文件只是為希望用一種標準化方法訪問本地繪圖功能的開發人員提供一種便利。我認為這表示將 JDK 移植到其它平臺的廠商可以不提供這個 API。 


庫:一個以 jawt.lib 命名的新庫已添加到 SDK 的庫目錄中。如前所述,這個庫包含一個用于把 J2AWT 包含到您的應用程序中所需要的入口點。例如,要鏈接到 GetDrawingSurfaceInfo 入口點,您需要在您的程序中包含 jawt.lib。 

工具:javah 工具用來為 Java 類的本地函數生成 C/C++ 頭文件,javac 工具用來編譯 Java 源文件。 

小結
將原有軟件系統移植到 Java 中并不容易,尤其是當原有軟件包含高性能的繪圖器時。Java 2 AWT 本地接口使得分階段移植變得較為容易,它允許您首先移植對性能要求不高的代碼,然后再移植關鍵的繪制代碼。它同時使第三方窗口小部件開發廠商更能嚴肅地看待針對 Java 產品的開發。有了 Java 2 AWT 本地應用程序接口,您就可以移植原有的 GUI 代碼,并更快地完成開發,這樣就不會犧牲您為提高本地代碼關鍵部分的性能而作的投資。

本欄文章均來自于互聯網,版權歸原作者和各發布網站所有,本站收集這些文章僅供學習參考之用。任何人都不能將這些文章用于商業或者其他目的。( ProgramFan.Com )
 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色偷偷一区二区三区| 国产精品88888| ●精品国产综合乱码久久久久| 精品人在线二区三区| 在线不卡a资源高清| 欧美日韩精品一区二区天天拍小说 | 亚洲日本va在线观看| 欧美激情一区二区三区全黄 | 国产成人免费视| 国产乱子伦视频一区二区三区 | 91视频观看视频| 91精彩视频在线| 欧美日韩国产123区| 日本乱人伦一区| 在线精品视频免费观看| 欧美三级视频在线观看| 日韩三级.com| 国产三级精品视频| 一区二区三区在线视频免费观看| 亚洲精品中文在线影院| 午夜视频在线观看一区| 国产一区二区三区免费| 一本色道久久综合亚洲aⅴ蜜桃| 欧美视频一区二区三区四区 | 国产精品自拍一区| 成人精品gif动图一区| 91高清视频在线| 精品少妇一区二区三区免费观看| 国产日韩精品一区二区浪潮av| 国产精品视频一二三| 亚洲你懂的在线视频| 免费久久99精品国产| 成人avav在线| 欧美又粗又大又爽| 精品国产一区二区精华| 一区二区三区四区中文字幕| 狂野欧美性猛交blacked| 成人激情免费视频| 91精品国产综合久久久久久久| 国产精品理论片在线观看| 首页欧美精品中文字幕| www.在线欧美| 欧美刺激脚交jootjob| 亚洲男人的天堂av| 国产精品亚洲一区二区三区在线| 精品视频免费在线| 国产女人aaa级久久久级| 天天免费综合色| 色香蕉久久蜜桃| 久久精品日韩一区二区三区| 日韩国产在线一| 色综合久久88色综合天天6| 久久综合久久综合亚洲| 婷婷开心久久网| 在线观看国产日韩| 亚洲欧洲精品一区二区精品久久久| 人人精品人人爱| 欧美老女人第四色| 一区二区三区四区在线免费观看 | 欧美xingq一区二区| 一区二区三区在线免费观看| 国产精品综合二区| 精品少妇一区二区三区在线视频| 日韩av中文字幕一区二区三区 | 精品国产一区二区三区久久影院| 夜夜嗨av一区二区三区中文字幕 | www.一区二区| 国产三级精品三级| 国产精品一二三四区| 久久综合九色综合97婷婷| 日本中文一区二区三区| 在线不卡中文字幕播放| 香蕉av福利精品导航| 欧美一a一片一级一片| 亚洲人成网站精品片在线观看| 国产高清在线观看免费不卡| 国产色产综合产在线视频| 国产精品一区2区| 国产精品电影院| 97久久精品人人爽人人爽蜜臀| 亚洲精品一区在线观看| 国产馆精品极品| 欧美zozozo| 粗大黑人巨茎大战欧美成人| 国产精品久久久久久久久免费桃花 | 精品国产免费人成在线观看| 日韩av中文字幕一区二区三区 | 中文一区二区在线观看| 成年人午夜久久久| 日韩毛片高清在线播放| 色婷婷综合久久久久中文 | 亚洲女爱视频在线| 欧美性受xxxx| 久久97超碰色| 国产精品免费视频一区| 在线免费观看视频一区| 亚洲自拍另类综合| 欧美一级黄色片| 岛国av在线一区| 亚洲女同女同女同女同女同69| 欧美亚洲一区三区| 蜜桃精品视频在线观看| 国产清纯美女被跳蛋高潮一区二区久久w| 成人免费观看av| 一区二区三区成人| 精品美女被调教视频大全网站| 国产激情偷乱视频一区二区三区| 中文字幕综合网| 日韩女优电影在线观看| 99在线精品免费| 免费在线观看不卡| 国产精品国产三级国产普通话99 | 国产精品综合久久| 亚洲精选免费视频| 欧美变态tickling挠脚心| 97se亚洲国产综合自在线| 免费在线欧美视频| 亚洲色图一区二区三区| 日韩欧美国产综合在线一区二区三区| 不卡免费追剧大全电视剧网站| 日韩成人免费看| 一区二区三区在线免费播放| 欧美成人官网二区| 欧美日韩在线直播| 成人a区在线观看| 久久国产综合精品| 亚洲一区二区av在线| 国产精品系列在线| 精品国产一区二区三区久久久蜜月| 在线视频观看一区| 成人免费看的视频| 九色综合国产一区二区三区| 亚洲影视资源网| 国产精品国产精品国产专区不蜜| 精品国产欧美一区二区| 91精品国产入口在线| 欧美视频你懂的| 99久久综合色| 不卡av电影在线播放| 国产寡妇亲子伦一区二区| 久久成人麻豆午夜电影| 亚洲电影一区二区| 中文字幕人成不卡一区| 国产欧美日本一区视频| 久久久噜噜噜久久中文字幕色伊伊 | 欧美另类久久久品| 色综合中文字幕| 99re视频精品| 成人在线视频一区| 成人免费观看视频| 波多野结衣中文一区| 成人av在线影院| av在线这里只有精品| 成人午夜在线免费| 成人爱爱电影网址| 91在线高清观看| www.99精品| 色av一区二区| 色综合天天综合狠狠| 色女孩综合影院| 在线免费av一区| 日本道色综合久久| 欧美亚洲国产bt| 555夜色666亚洲国产免| 日韩欧美一级在线播放| 亚洲精品在线网站| 日本一区二区三区免费乱视频| 日韩亚洲欧美综合| 精品国产免费久久| 1000部国产精品成人观看| 亚洲免费在线播放| 五月天亚洲婷婷| 国产在线国偷精品免费看| 成人午夜在线免费| 欧美专区亚洲专区| 日韩免费视频线观看| 欧美精品一区二区三区高清aⅴ| 中文字幕高清不卡| 成人欧美一区二区三区小说| 亚洲一区自拍偷拍| 狠狠狠色丁香婷婷综合久久五月| av在线一区二区三区| 在线电影欧美成精品| 国产欧美日韩另类一区| 一区二区在线观看视频在线观看| 视频一区中文字幕| 高清免费成人av| 欧美色大人视频| 国产日韩欧美制服另类| 一区二区三区免费在线观看| 麻豆精品久久久| 色综合久久久久综合体桃花网| 56国语精品自产拍在线观看| 国产欧美一区二区精品婷婷| 亚洲国产美国国产综合一区二区 | 国产精品久久久久国产精品日日| 亚洲电影一级黄| 99re8在线精品视频免费播放| 91精品国产综合久久精品app | 欧洲激情一区二区|