【问题标题】:How to get a Java component ID如何获取 Java 组件 ID
【发布时间】:2011-03-08 13:57:54
【问题描述】:


我在我的 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() 方法。我想知道是否有解决方法。
非常感谢您的帮助。

【问题讨论】:

  • 弃用是一厢情愿;它已被弃用 b/c 它可能不可移植,但您并不关心。所以你做的是对的!其实你不需要使用反射。 WComponentPeer 有一个公共的 getHWnd(),所以你需要 ((WComponentPeer) c.getPeer()).getHWnd()

标签: java components window hwnd peer


【解决方案1】:

我删除了一条评论,但值得回答。 添加本机代码,MPlayer,所以你被 impl 和操作系统困住了。 getPeer() 的弃用主要是 b/c 你可以用它做一些非常奇怪的事情,而不是可移植的。

在你的情况下没关系。

附带说明:WComponentPeer 有一个公共的 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..
}

祝你好运!

【讨论】:

    【解决方案2】:

    根据documentation getPeer() 已被 isDisplayable() 取代,但这不会满足您的需求。显然,像您一样访问对等点是违反规范的(查看here 了解更多信息)。

    如果您绝对必须拥有该 ID,那么您需要另一种方法来获取它,因为正如我提到的,getPeer() 甚至还没有被具有类似功能的某些方法取代,它现在实际上已成为“私有”。

    【讨论】:

    • 实际上 OP 正在使用 getPeer 完全符合它的预期。在最好的情况下违反文档可能会使代码不可移植,但他已经决定获得 hWnd(在 Windows 中),所以没关系。
    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2019-11-24
    • 2012-07-19
    • 2013-01-14
    • 2018-12-08
    相关资源
    最近更新 更多