下面這段話摘自 JDK1.3 的某個(gè)頭文件,它說(shuō)明了這種新的 API 的開(kāi)發(fā)背景及原因:
AWT 支持使用本地 C 或 C++ 應(yīng)用程序訪問(wèn) AWT 的本地結(jié)構(gòu)。這是為了便于將原有的 C 或 C++ 應(yīng)用程序移植到 Java 并滿足需要 ... [這些應(yīng)用程序] 出于性能方面的原因在畫(huà)布上自行進(jìn)行本地繪制
在 JDK1.3 以前,Java 編程沒(méi)有明確的方法來(lái)訪問(wèn)基層的同等 GUI 組件的句柄。在 JDK 1.3 中, Sun 公司創(chuàng)建了一種標(biāo)準(zhǔn)機(jī)制,通過(guò)這種機(jī)制,開(kāi)發(fā)人員可以使本地 GUI 應(yīng)用程序和庫(kù)在 Java AWT Canvas 對(duì)象中進(jìn)行繪制。這意味著現(xiàn)在有一種正式的、有保證的方法來(lái)獲得支持這一功能的信息。當(dāng) JDK 1.3 與其他操作平臺(tái)對(duì)接時(shí),所有的接口都提供相同的信息 -- 而不管使用的是什么系統(tǒng)。JDK 1.3 的 Windows 版本和 Solaris 版本是首先提供這種支持的實(shí)現(xiàn)。
Sun 公司引入這一功能組件有幾方面的原因。首先, JDK 1.3 使得人們可以將依靠第三方產(chǎn)品的復(fù)雜原有軟件移植到 Java 上,而不必等到第三方產(chǎn)品本身完成移植以后。第二個(gè)原因即性能;假如本地的 GUI 代碼經(jīng)過(guò)人們長(zhǎng)時(shí)期的努力得到優(yōu)化,則原樣保留這些軟件具有重要的商業(yè)價(jià)值。
在本文中,我將介紹一些該功能部件的基本概念。我將逐步開(kāi)發(fā)一個(gè)窗口小部件樣例,該窗口小部件使用Win32 API 進(jìn)行繪制。下圖是最終的窗口小部件的快照,一個(gè)帶有笑臉的圓形窗口。
分步概覽
第一步,定義一個(gè) Java 類 -- 比如說(shuō),Mywindow -- 使其繼續(xù) Canvas 類并重載 paint 方法。您使用 paint 方法執(zhí)行 AWT 對(duì)象的繪制操作,并在覆蓋該方法時(shí)加上 native 要害字。覆蓋方法使您能夠使用自己的本地代碼。您必須構(gòu)建自己的本地代碼并把它編譯成一個(gè)動(dòng)態(tài)連接庫(kù),就像我們處理其他的 Java 本地接口應(yīng)用程序一樣,在本例中,我們將調(diào)用 MyWindow.DLL 庫(kù)。在 Solaris 和 linux 上則為共享對(duì)象或共享庫(kù)。您還需要用 System.loadLibrary("MyWindow") 調(diào)用將 MyWindow.DLL 庫(kù)加載到您的名為 MyWindow 的 Java 類中。
完成這一示例需要二個(gè)部分:其一是 MyWindow.Java ,它提供 Canvas 類的子類,其二是 MyWindow.CPP ,它包含基于 Java 本地接口的繪制子程序的入口點(diǎn)。 在參考資源部分可找到 MyWindow.Java、MyWindow.CPP 及自動(dòng)執(zhí)行編譯的批處理文件 BUILD.BAT。
第一步: 創(chuàng)建 MyWindow Java 類
J2AWT 用于這種方法時(shí)有一個(gè)主要的局限性:本地代碼只能對(duì) java.awt.Canvas 類的子類進(jìn)行操作。這正是 MyWindow 繼續(xù) Canvas 類的原因。在 Java 應(yīng)用程序中,您可以像使用 Canvas 的其它子類那樣使用 MyWindow;在本例中,我將 MyWindow 添加到 Jwindow 中。
import java.awt.*;
import javax.swing.*;
public class MyWindow extends Canvas {
static {
//加載包含 paint 代碼的庫(kù)。
System.loadLibrary("MyWindow");
}
//繪制操作的本地入口點(diǎn)
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);
}
}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注