首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java swing中创建X窗口(X11)并获取其id

在java swing中创建X窗口(X11)并获取其id
EN

Stack Overflow用户
提问于 2009-10-07 04:50:15
回答 5查看 5.6K关注 0票数 3

有没有人能帮助我用eclipse在java swing中创建一个X11窗口?还有,获取x11 id also.What的函数是在java中创建X11窗口的基本要求。

EN

回答 5

Stack Overflow用户

发布于 2009-10-07 05:05:47

汤姆回答了你问题的第一部分。答案的第二部分是:要获取X11窗口的id,您必须使用本机代码(用C或C++编写的代码)并通过JNI接口访问它。

您可能需要在所有现有窗口中按标题进行搜索才能找到您想要的窗口。

下面是一个递归函数,它将搜索(从根窗口开始)具有所需名称的窗口

代码语言:javascript
复制
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,并且有轻微的内存泄漏问题,这就是导致这些问题的原因。

票数 3
EN

Stack Overflow用户

发布于 2009-10-07 04:59:26

在Swing中创建X11窗口非常简单,只需先使用new Frame(),然后使用setVisible(true)即可。获取任何未抽象的细节将变得更加困难。当然,您也可以打开连接到6000端口左右的java.net.Socket,自己说X11。

票数 2
EN

Stack Overflow用户

发布于 2015-10-07 19:57:05

为了扩展@Zubzub@ArtemGr给出的答案,下面这个简约的AWT示例适用于我,至少在SunJava1.8中是适用的:

代码语言:javascript
复制
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下运行,上述解决方案也是不可移植的:

  • GCJ将使用gnu.java.awt.peer.gtk.GtkFramePeer,而
  • 较早的Sun版本(1.4及更低)将使用sun.awt.motif.MFramePeer。尽管从1.5开始,XToolkit是Sun上的默认设置,但在1.5和1.6上,旧的MToolkit仍然可以是re-enabled,而
  • 我不确定IBM J9、BEA JRockit、Oracle lwAWT和Apache Harmony。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1529526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档