如何在C#winforms控件上嵌入Java控件?

我可以在C#控件上放置Java控件(SWT,Swing,…)吗?

我知道有可能使用网页控件,但我不喜欢这种方式。

我已经重新检查过,看起来IKVM目前在它的AFT组件中没有足够的支持。 我认为做你需要的唯一方法就是在隐藏主窗口的单独进程中运行java控件,并以某种方式将该控件的句柄传递给你的C#应用​​程序。


原始答案:

我不确定你是否可以“添加”它,但你可以尝试这个方向:

有必要通过IKVM将java类转换为.Net程序集。

  1. 首先,你需要掌握java控件。 如果您需要有关如何执行此操作的信息,可以查看此post 。 我在这一步失败了,因为我没有在IKVM的库中找到Win32DrawingSurface和DrawingSurfaces,也许只需在java端创建一些静态的getHandle()方法。

  2. 获取父C#控件的句柄。 这很简单,因为Control具有Handle属性。

  3. 获得两个句柄后,您可以将其中一个设置为另一个父项。 为此,您需要从WINAPI调用SetParent函数。

    [DllImport(“user32.dll”)] private static extern IntPtr SetParent(IntPtr hWndChild,IntPtr hWndNewParent);

我写了一些例子:
– 在.NET GUI中嵌入Java组件,
– 在Java GUI中嵌入.NET WinForm组件。
您可以在产品中找到它们:

http://www.simtel.net/product.php%5Bid%5D95126%5BSiteID%5Dsimtel.net
http://www.simtel.net/product.php%5Bid%5D98653%5BSiteID%5Dsimtel.net

您可以使用JNBridge来执行此操作。

http://www.jnbridge.com/jnbp-examples.htm#JinN

查看IKVM项目。 它是一个在.net中实现的Java虚拟机,它允许java和.net互操作性。

不确定它究竟有多完整,是否能够实现您所需的function,但值得一看。

如果控件不是自定义控件而且只是摆动,你可能会发现它在Microsoft的Visual J#中可用(版本2.0或1.1的补充添加) http://msdn.microsoft.com/en-us/vjsharp/ bb188695.aspx )

请注意,J#Swing控件不会直接在WinForms应用程序中播放球,您可能需要提供一个主机控件,该控件将所有绘图委托从一个隐藏的J#Control中复制图像,该控件放置在一个简单的j#Form中(也隐藏在表单的位置)视图区域被resize以匹配主机控件的视图区域。这至少可以消除对单独进程的需要。这种用法有一些限制,我怀疑你想要使用的控件很复杂(或者你只是重新实现了它)。

请注意,J#正式死亡(没有更严重的维护),并且在2015年将完全不支持它。期望使用它会给你带来相当大的痛苦,但如果你真的需要它的一部分,这可能会有所帮助。

Interesting Posts