有没有人能帮助我用eclipse在java swing中创建一个X11窗口?还有,获取x11 id also.What的函数是在java中创建X11窗口的基本要求。
发布于 2009-10-07 05:05:47
汤姆回答了你问题的第一部分。答案的第二部分是:要获取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,并且有轻微的内存泄漏问题,这就是导致这些问题的原因。
发布于 2009-10-07 04:59:26
在Swing中创建X11窗口非常简单,只需先使用new Frame(),然后使用setVisible(true)即可。获取任何未抽象的细节将变得更加困难。当然,您也可以打开连接到6000端口左右的java.net.Socket,自己说X11。
发布于 2015-10-07 19:57:05
为了扩展@Zubzub和@ArtemGr给出的答案,下面这个简约的AWT示例适用于我,至少在SunJava1.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实用程序验证其id。
但是,请注意,即使您的AWT应用程序只能在X11下运行,上述解决方案也是不可移植的:
gnu.java.awt.peer.gtk.GtkFramePeer,而sun.awt.motif.MFramePeer。尽管从1.5开始,XToolkit是Sun上的默认设置,但在1.5和1.6上,旧的MToolkit仍然可以是re-enabled,而lwAWT和Apache Harmony。https://stackoverflow.com/questions/1529526
复制相似问题