有人能帮我使用Eclipse在Java Swing中创建X11窗口吗?还需要获取x11 id的函数。在Java中创建X11窗口的基本要求是什么。
Tom回答了你问题的第一部分。答案的第二部分是:要获取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);
}
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
工具验证其 id。gnu.java.awt.peer.gtk.GtkFramePeer
,而sun.awt.motif.MFramePeer
。尽管从 1.5 开始 XToolkit
是默认值,在 1.5 和 1.6 上仍然可以重新启用旧的MToolkit
,以及lwAWT
和 Apache Harmony。在Swing中创建一个X11窗口就像使用new Frame()
,然后跟着setVisible(true)
一样容易。获取任何未抽象化的细节将会更加困难。当然,您可以始终打开到端口6000左右的java.net.Socket
并自己运行X11。
如果您正在使用Sun JVM并且不介意使用反射和“setAccessible(true)”覆盖包访问权限,则可以使用Sun的工具包创建X11窗口。 https://www.docjar.com/docs/api/sun/awt/X11/XWindow.html
但是,并非所有工具包方法都可能存在:我怀疑未在工具包本身中使用的方法已被删除。例如,大多数XlibUtil并不存在其中。 以下是一个示例,展示如何使用Scala反射来访问工具包方法:http://gist.github.com/567076
您还可以使用JNA在Java中编写xlib部分的代码;请参见问题:Using Xlib via JNA to move a window
对于那些仍在寻找的人:
您需要找到程序最顶层的组件,并获取该组件的 'componentpeer'。在Linux下,它将是扩展XWindow的XComponent peer类型,XWindow又扩展自XBaseWindow。XBaseWindow具有类型为long的属性窗口。这就是您要找的。您可能需要使用反射来获取它。
hf