簡體   English   中英

在Java swing中創建X window(X11)並獲取其ID

[英]to create X window(X11) in java swing and to get its id

有人可以幫助我使用Eclipse在Java swing中創建X11窗口嗎?還有獲取X11 ID的函數。在Java中創建X11窗口的基本要求是什么。

湯姆回答了您問題的第一部分。 答案的第二部分是:要獲取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並有較小的內存泄漏問題,這是導致它們的原因。

為了擴展@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()));
    }
}

窗口可見后,您可以使用xwininfo實用程序驗證其ID。

但是請注意,即使您的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上重新啟用舊的MToolkit ,並且
  • 我不確定IBM J9BEA JRockitOracle lwAWTApache Harmony

在Swing中創建X11窗口就像new Frame()setVisible(true)一樣容易。 獲得任何基本信息將更加困難。 當然,您總是可以打開一個java.net.Socket到端口6000左右,並自己說X11。

如果您使用的是Sun JVM,並且不介意使用反射和“ setAccessible(true)”覆蓋包訪問,則可以使用Sun的工具包來創建X11窗口。 https://www.docjar.com/docs/api/sun/awt/X11/XWindow.html

但是,並不是所有的工具箱方法都存在:我懷疑工具箱本身未使用的方法已刪除。 例如,大多數XlibUtil都不存在。 這是在Scala中如何使用反射來訪問工具包方法的示例: http : //gist.github.com/567076

您也可以使用JNA在Java中對xlib部件進行編碼。 看到問題: 通過JNA使用Xlib移動窗口

對於那些仍然在尋找這個的人:

您需要找到程序中最頂層的組件,並獲取該組件的“ componentpeer”。 在linux下,它的類型為XComponent peer,它擴展了XWindow,后者又擴展了XBaseWindow。 XBaseWindow具有類型為long的屬性窗口。 這就是您要尋找的。 您可能需要使用反射來達到目的。

高頻

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM