Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何单击JDialog?_Java_Swing - Fatal编程技术网

Java 如何单击JDialog?

Java 如何单击JDialog?,java,swing,Java,Swing,我有一个JDialog,我想用它作为游戏的覆盖。这个对话框只是在我的屏幕中央画了一个自定义十字线,但很明显,由于fps游戏倾向于将玩家光标居中,我无法使用我的任何武器,因为JDialog只是聚焦 我如何通过JDialog传递点击事件,以便下面的游戏接收它们而不是我的JDialog。现在我将它设置为“未装饰”,只有在我单击实际的十字线图形时,它才会接收单击事件 编辑:我为外部游戏创建了一个十字线,而不是我自己的。这可能会有帮助: testDialog.setFocusableWindowState

我有一个JDialog,我想用它作为游戏的覆盖。这个对话框只是在我的屏幕中央画了一个自定义十字线,但很明显,由于fps游戏倾向于将玩家光标居中,我无法使用我的任何武器,因为JDialog只是聚焦

我如何通过JDialog传递点击事件,以便下面的游戏接收它们而不是我的JDialog。现在我将它设置为“未装饰”,只有在我单击实际的十字线图形时,它才会接收单击事件

编辑:我为外部游戏创建了一个十字线,而不是我自己的。这可能会有帮助:

testDialog.setFocusableWindowState(false);
从这里开始:

除此之外,最好是将帧的图形对象放在后面,并使用图形直接绘制十字线

例如


我发现使用JNA和以下代码可以实现这一点

private static void setTransparent(Component w) {
    WinDef.HWND hwnd = getHWnd(w);
    int wl = User32.INSTANCE.GetWindowLong(hwnd, WinUser.GWL_EXSTYLE);
    wl = wl | WinUser.WS_EX_LAYERED | WinUser.WS_EX_TRANSPARENT;
    User32.INSTANCE.SetWindowLong(hwnd, WinUser.GWL_EXSTYLE, wl);
}

/**
 * Get the window handle from the OS
 */
private static HWND getHWnd(Component w) {
    HWND hwnd = new HWND();
    hwnd.setPointer(Native.getComponentPointer(w));
    return hwnd;
}

我仍然无法点击它,我的鼠标光标在它上面变得可见,当我点击底层游戏时,什么也没有发生,这也是我当前绘制十字线的方式。那你为什么需要这个对话框呢?也许你可以把它拿走?对于您的问题:另一个选项是在对话框中捕捉mouseevent。调用panel.myOnClickMethodclickX+dialogOffset,clickY+dialogOffset我需要这个对话框来获得一个图形对象来绘制?因为swing中的任何面板、框架或一般组件都将使用getGraphics方法。为什么要使用JDialog来实现这种功能?那完全是倒退。我在这方面没有经验。你能推荐一个替代方案吗?
private static void setTransparent(Component w) {
    WinDef.HWND hwnd = getHWnd(w);
    int wl = User32.INSTANCE.GetWindowLong(hwnd, WinUser.GWL_EXSTYLE);
    wl = wl | WinUser.WS_EX_LAYERED | WinUser.WS_EX_TRANSPARENT;
    User32.INSTANCE.SetWindowLong(hwnd, WinUser.GWL_EXSTYLE, wl);
}

/**
 * Get the window handle from the OS
 */
private static HWND getHWnd(Component w) {
    HWND hwnd = new HWND();
    hwnd.setPointer(Native.getComponentPointer(w));
    return hwnd;
}