在的Java Swing创建X窗口(X11),并获得其ID(to create X window(X

2019-07-21 05:08发布

谁能帮我在使用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的甲骨文 lwAWTApache和谐


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



文章来源: to create X window(X11) in java swing and to get its id
标签: java x11