在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开始,XToolkit
是Sun JDK的默认设置,但旧的MToolkit
仍然可以在1.5和1.6上重新启用 ,并且 - 我不确定IBM J9 , BEA JRockit , Oracle
lwAWT
和Apache 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