我有一個JDialog,我想用它作爲遊戲的疊加層。該對話框只是在我的屏幕中心畫一個自定義的十字線,但很明顯,因爲fps遊戲傾向於集中玩家光標,所以我無法使用任何我的武器,因爲JDialog只是集中注意力。如何點擊一個JDialog?
我怎麼能通過通過JDialog點擊事件,以便下面的遊戲接收它們而不是我的JDialog。現在我已將它設置爲undecorated,並且如果單擊實際的十字線圖形,它只會收到點擊事件。
編輯:我創建了一個外部遊戲的十字準線,不是我自己的。
我有一個JDialog,我想用它作爲遊戲的疊加層。該對話框只是在我的屏幕中心畫一個自定義的十字線,但很明顯,因爲fps遊戲傾向於集中玩家光標,所以我無法使用任何我的武器,因爲JDialog只是集中注意力。如何點擊一個JDialog?
我怎麼能通過通過JDialog點擊事件,以便下面的遊戲接收它們而不是我的JDialog。現在我已將它設置爲undecorated,並且如果單擊實際的十字線圖形,它只會收到點擊事件。
編輯:我創建了一個外部遊戲的十字準線,不是我自己的。
這可以幫助:
testDialog.setFocusableWindowState(false);
從這裏: Stop newly created dialog from taking focus
除此之外,也許是更好的,你得到的幀的圖形對象在後面,並使用圖形繪製十字準線直接。
E.g.
Graphics g = panel.getGraphics();
g.setColor(CROSSHAIR_COLOR);
g.drawLine(.....); // Vertical Line
g.drawLine(.....); // Horizontal Line
我仍然無法點擊它,我的鼠標光標變得可見,當我點擊底層遊戲時沒有發生任何事情,也就是目前我如何繪製十字準線。 –
那麼爲什麼你需要對話框?也許你可以刪除它?對於你的問題:另一種選擇是你捕捉對話框中的mouseevent。並調用像panel.myOnClickMethod(clickX + dialogOffset,clickY + dialogOffset) –
我需要對話框來獲取圖形對象來繪製。 –
我發現這是可以實現的使用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;
}
爲什麼要用JDialog來做類似的事情?這完全是倒退。 – Kayaman
我在這方面沒有經驗,你能推薦一種替代方案嗎? –