如何获取Java组件ID

如何获取Java组件ID,java,components,window,hwnd,peer,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


我正在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);
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..
}
long winid=0//窗口ID。
if(osName.startsWith(“Windows”)){
最终类cl=Class.forName(“sun.awt.windows.WComponentPeer”);
java.lang.reflect.Field f=cl.getDeclaredField(“hwnd”);
f、 setAccessible(true);
winid=f.getLong(overlay.getPeer());//overlay是嵌入MPlayer的画布。
}
System.out.println(winid);
但是,getPeer()方法已被弃用。我想知道是否有解决办法。
非常感谢您的帮助。

据了解,getPeer()已被isDisplayable()取代,但这并不能满足您的需要。显然,像你这样访问同龄人违反了规范(查看更多信息)


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

我发表了一条评论,但这值得回答。 添加本机代码MPlayer,因此您只能使用impl和操作系统。getPeer()的弃用主要是b/c,您可以用它做一些非常奇怪的事情,但它不可移植

对你来说没关系

另一方面:WComponentPeer有一个公共getHWnd()方法,所以您不需要通过反射来欺骗它。您现在拥有的代码实际上相当不安全,因为它不检查实际的对等方

您可以这样替换它:

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);
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..
}

祝你好运

不赞成是一厢情愿;不推荐使用b/c,它可能不可移植,但您不关心。所以你所做的是正确的!实际上,你不需要使用反射。WComponentPeer有一个公共getHWnd(),因此您需要((WComponentPeer)c.getPeer())。getHWnd()实际上OP使用的是
getPeer
,与预期的完全一样。在最好的情况下,违反文档可能会使代码不可移植,但他已决定获得hWnd(在windows中),因此这无关紧要。