谁能帮我在使用eclipse中创建的Java Swing的X11窗口?而且还函数来获取X11 ID also.What是创建Java中的X11窗口的基本要求。
Answer 1:
汤姆回答你的问题的第一部分。 答案的第二部分是:让你将不得不通过JNI接口来使用本地代码(代码写在C或C ++)和访问它的X11窗口的ID。
您可能必须通过所有现有的Windows运行由标题搜索,获得你想要的一个。
下面是将搜索(从根窗口开始)为一个窗口,其中所期望的名称的递归函数
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,并有轻微的内存泄漏问题,这是什么造成他们。
Answer 2:
只是为了扩大答案@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()));
}
}
一旦窗口是可见的,你可以验证它的ID与xwininfo
工具。
请注意,但是,即使你提供AWT的应用程序将仅X11下运行,上述方案是不可移植:
- GCJ将使用
gnu.java.awt.peer.gtk.GtkFramePeer
,和 - 较早的Sun JDK版本(1.4以下)将使用
sun.awt.motif.MFramePeer
。 尽管XToolkit
是先从1.5在Sun JDK默认,老MToolkit
仍然可以重新启用 1.5和1.6, - 我不知道IBM J9,BEA JRockit的 , 甲骨文
lwAWT
和Apache和谐 。
Answer 3:
创建Swing中的X11窗口是一样简单new Frame()
然后setVisible(true)
。 得到任何的unabstracted细节将变得更加困难。 当然,你可以随时打开java.net.Socket
端口6000左右和自己说话X11。
Answer 4:
如果你使用的是Sun JVM和使用反射,不介意压倒一切的包访问“setAccessible(真)”,那么你就可以创建一个使用Sun的工具包的X11窗口。 https://www.docjar.com/docs/api/sun/awt/X11/XWindow.html
不是所有的工具包的方法可能存在,但我怀疑本身被拆除工具包不使用的方法。 例如,大多数XlibUtil的不存在。 下面是一个例子如何使用反射来访问该工具包的方法,在斯卡拉: http://gist.github.com/567076
您还可以使用JNA用Java编写的xlib部分; 见问题: 通过使用JNA到Xlib的移动窗口
Answer 5:
对于那些在那里仍然在寻找这样的:
你需要找到你的程序的最顶层部分,并得到该组件的“componentpeer”。 linux下,这将是其延伸XWindow的类型XComponent对等体,其延伸XBaseWindow的。 XBaseWindow有long类型的属性窗口。 这就是你要找的内容。 你可能需要使用反射来得到它。
HF