java - 如何获取 Java 组件 ID

标签 java components window hwnd peer


我在我的 java 应用程序中使用 MPlayer。根据它的文档,我需要告诉 MPlayer 嵌入它的窗口 ID。我是这样做的:

long winid = 0; //Window ID.
if (osName.startsWith("Windows")){
   final Class<?> cl = Class.forName("sun.awt.windows.WComponentPeer");
   java.lang.reflect.Field f = cl.getDeclaredField("hwnd");
   f.setAccessible(true);
   winid = f.getLong(overlay.getPeer()); //overlay is a canvas where MPlayer is embedded.
}
System.out.println(winid);

但是,getPeer() 方法已被弃用。我想知道是否有解决方法。
非常感谢您的帮助。

最佳答案

我发表了评论,但值得回复。 添加 native 代码,MPlayer,所以你受困于 impl 和操作系统。 getPeer() 的弃用主要是因为你可以用它做一些非常奇怪的事情,而不是便携的。

在您的情况下,这无关紧要。

附带说明:WComponentPeer 有一个公共(public)的 getHWnd() 方法,所以您不需要通过反射来欺骗它。您现在拥有的代码实际上非常不安全,因为它不检查实际的对等点。

你可以这样替换它:

long hWnd = 0
try{ 
  Class clazz = Class.forName("sun.awt.windows.WComponentPeer);
  synchronized(overlay.getTreeLock()){
    ComponentPeer peer = overlay.getPeer();
    if (clazz.isInstance(peer)){
      hWnd = ((sun.awt.windows.WComponentPeer) overlay.getPeer()).getHWnd();
    }
  }
}catch(ClassNotFound _noWindows){
//process..
}

祝你好运!

关于java - 如何获取 Java 组件 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5233445/

相关文章:

java - Hibernate 未使用 Oracle 12c 返回自动增量列的正确值

java - 新建 >> 项目 >> Android 应用程序项目不起作用

javascript - 在 Reactjs 中使用另一个组件中的数据

javascript - 如何阻止浏览器窗口跳转到 #ID 哈希链接 - 需要最简单的 JavaScript

java - 如何覆盖单个按钮的 Nimbus 按钮边距

java - 如何通过执行另一个类中的操作来更改一个类中图形的颜色?

button - 单击按钮即可停用输入 react

Android:以编程方式从设备管理员中删除我的应用程序?

android - Android 是否使用自定义窗口系统?

c++ - 使用 OpenGL 和 GLU 在 NURB 上查找点