在JFrame或JPanel上重新设置X11窗口的父窗口?

3

为了将一个C/C++ X11应用程序嵌入到另一个Java应用程序中,是否可以在以下组件中重新父窗口X11顶层小部件:

  • JFrame或JWindow(使用sun.awt.x11包捕获其X11对等体的X11窗口ID)?
  • 或JPanel?

我更喜欢使用JPanel重新父窗口,但我不确定是否可能。


你好,我不明白为什么我的问题会得到-1的投票。我的问题有什么问题吗? - paranoia25
第一个问题:你能否使用JNI将C++应用程序嵌入JVM中,还是它们必须保持为独立的应用程序?如果这些应用程序链接在一起,那么这样做会更容易。 - Ernest Friedman-Hill
第二个问题:是否涉及OpenGL? - Ernest Friedman-Hill
从未尝试过,但也许这种方法会有所帮助:http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/awt/X11/XPanelPeer.html#xembed(long) - Konstantin V. Salikhov
第一个问题:它们必须保持为单独的应用程序。 第二个问题:没有涉及OpenGL。 - paranoia25
1个回答

2
我找到了以下内容:
一种递归函数,可以从根窗口开始搜索具有所需名称的窗口。
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);
}

您可以始终打开一个java.net.Socket 6000号端口 或类似的端口,并手动使用X11进行通信。这里有一些可能有所帮助的 代码参考,希望这能帮到您。注意:jdk7中没有sun.awt.x11包。

谢谢!我会尝试你的解决方案。保持信息更新。 - paranoia25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接