在java swing中创建X窗口(X11)并获取其id

任何人都可以帮助我使用eclipse在java swing中创建一个X11窗口吗?还有用于获取x11 id的函数。在java中创建X11窗口的基本要求是什么。

汤姆回答了你问题的第一部分。 答案的第二部分是:要获取X11窗口的id,您将不得不使用本机代码(用C或C ++编写的代码)并通过JNI接口访问它。

您可能必须通过所有现有窗口按标题运行搜索才能获得所需的搜索。

这是一个递归函数,它将搜索(从根窗口开始)具有所需名称的窗口

Window windowWithName(Display *dpy, Window top, char *name) { Window *children, dummy; unsigned int nchildren; unsigned int i; Window w = 0; char *window_name; if (XFetchName(dpy, top, &window_name) && !strcmp(window_name, name)) return (top); if (!XQueryTree(dpy, top, &dummy, &dummy, &children, &nchildren)) return (0); for (i = 0; i < nchildren; i++) { w = windowWithName(dpy, children[i], name); if (w) break; } if (children) XFree((char *) children); return (w); } 

注意:**遗憾的是,在X11中实现的XFetchName函数中存在一个记录良好的内存泄漏,该函数从未修复过。 如果你运行valgrind并且有轻微的内存泄漏问题,那么这是什么导致它们。

只是为了扩展@Zubzub和@ArtemGr给出的答案,以下简约的AWT示例适用于我,至少在Sun的Java 1.8中:

 import java.awt.Dimension; import javax.swing.JFrame; import sun.awt.X11.XWindow; class C { public static void main(final String args[]) { final JFrame frame = new JFrame(); frame.setPreferredSize(new Dimension(200, 200)); frame.pack(); frame.setVisible(true); final XWindow xWindow = (XWindow) frame.getPeer(); frame.setTitle("Window id: 0x" + Long.toHexString(xWindow.getWindow())); } } 

一旦窗口可见,您就可以使用xwininfo实用程序validation其id。

但请注意,即使您的AWT应用程序仅在X11下运行,上述解决方案也不可移植:

  • GCJ将使用gnu.java.awt.peer.gtk.GtkFramePeer ,并且
  • 较旧的Sun JDK版本(1.4及更低版本)将使用sun.awt.motif.MFramePeer 。 尽管从1.5开始, XToolkitSun JDK的默认设置,但旧的MToolkit仍然可以在1.5和1.6上重新启用 ,并且
  • 我不确定IBM J9BEA JRockitOracle lwAWTApache Harmony

在Swing中创建X11窗口就像new Frame()setVisible(true) 。 获取任何未经提取的细节将更加困难。 当然,您可以随时打开一个java.net.Socket到端口6000左右,并自己说X11。

如果您正在使用Sun JVM并且不介意使用reflection和“setAccessible(true)”覆盖包访问,那么您可以使用Sun的工具包创建X11窗口。 https://www.docjar.com/docs/api/sun/awt/X11/XWindow.html

但是,并非所有工具包的方法都存在:我怀疑工具箱本身未使用的方法已被删除。 例如,大多数XlibUtil都不存在。 以下是在Scala中如何使用reflection来访问工具包方法的示例: http : //gist.github.com/567076

您还可以使用JNA在Java中编写xlib部分代码; 看问题: 通过JNA使用Xlib移动窗口

对于那些仍然在寻找这个的人:

您需要找到程序中最顶层的组件并获取组件的“组件同步”。 在linux下,这将是XComponent类型,它扩展了扩展XBaseWindow的XWindow。 XBaseWindow有一个long类型的属性窗口。 这就是你要找的东西。 您可能需要使用reflection来实现它。

HF