在本文中,将探讨如何在Java应用程序中嵌入.NET GUI组件。这涉及到使用Java的JNI(Java Native Interface)与.NET平台进行交互。如果对面向对象的.NET JNI不熟悉,建议先阅读相关文章。本文将提供一个示例,展示如何将.NET的WPF组件嵌入到Java GUI中。
在之前的讨论中,介绍了Java和.NET代码集成的主要概念,并展示了一个将.NET GUI组件嵌入到Java界面的示例。如果对.NET的面向对象JNI不熟悉,建议先阅读相关文章。本文不讨论Windows Presentation Foundation (WPF)的详细内容,但提供了一个示例,展示如何将WPF组件嵌入到Java GUI中。
从Java的角度来看,任何WPF/.NET组件都是需要用Java类包装的原生代码片段。Java中有一个特殊的接口来处理WPF/.NET组件。这个接口必须包括创建组件实例和销毁实例的方法。在附带的示例代码中,将WPF时钟组件嵌入到Java GUI中。
Java代码示例:
package com.oojni;
import java.awt.Canvas;
public class WPFContainer extends Canvas {
static {
System.loadLibrary("oojni.net20");
System.loadLibrary("JavaHostWPF");
}
int ref = 0;
public void addNotify() {
super.addNotify();
ref = create(this);
}
public void removeNotify() {
dispose(ref);
super.removeNotify();
}
public void dispose() {
if (ref != 0)
dispose(ref);
ref = 0;
}
void updateClock() {
updateClock(ref);
}
native void updateClock(int ref);
native int create(Object parent);
native void dispose(int ref);
}
这个类覆盖了两个java.awt.Canvas方法:addNotify和removeNotify。addNotify在JVM创建java.awt.Canvas实例时被调用,这是创建原生WPF/.NET组件容器的地方。removeNotify在JVM销毁java.awt.Canvas实例时被调用,在这里销毁WPF/.NET组件容器。
在.NETJNI代码中,实现了以下方法:获取Java组件的窗口句柄hWnd,创建.NET组件容器实例,并将hWnd作为Java组件的子窗口添加,填充.NET组件容器实例。
.NET代码示例:
public override int create(ObjectOrientedJNI.JObject parent) {
WPFCreator creator = new WPFCreator(parent);
thread = new System.Threading.Thread(new System.Threading.ThreadStart(creator.Create));
thread.SetApartmentState(System.Threading.ApartmentState.STA);
thread.Start();
creator.autoEvent.WaitOne();
GlobalReference gref = new GlobalReference(creator.Control, true);
return gref.Reference.ToInt32();
}
在STA线程中,调用ObjectOrientedJNIInterop.com.oojni.WPFCreator类实例的create方法,在这里创建.NET WPF容器。