Как получить идентификатор компонента Java - PullRequest
2 голосов
/ 08 марта 2011

Я использую MPlayer в своем Java-приложении.Согласно документу, необходимо, чтобы я сообщил MPlayer идентификатор окна для его встраивания.Я делаю это так:

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 () устарел.Я хотел бы знать, есть ли обходной путь для этого.
Большое спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Я опустил комментарий, но это заслуживает ответа.Добавление нативного кода MPlayer, так что вы застряли с Impl и ОС.Устаревание getPeer () в основном связано с тем, что вы можете делать действительно странные вещи, а не переносимые.

В вашем случае это не имеет значения.

Примечание: 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..
}

удачи!

0 голосов
/ 09 марта 2011

Согласно документации getPeer () был заменен на isDisplayable (), но это не даст вам того, что вам нужно.Очевидно, это нарушение спецификации для доступа к партнерам, как вы (смотрите здесь для получения дополнительной информации).

Если вам абсолютно необходимо иметь идентификатор, то вам нужен другой способовладеть им, потому что, как я уже упоминал, getPeer () даже не был заменен каким-либо методом с похожей функциональностью, теперь он фактически стал «приватным».

...