2015-07-13 25 views
0

我有一個JDialog,我想用它作爲遊戲的疊加層。該對話框只是在我的屏幕中心畫一個自定義的十字線,但很明顯,因爲fps遊戲傾向於集中玩家光標,所以我無法使用任何我的武器,因爲JDialog只是集中注意力。如何點擊一個JDialog?

我怎麼能通過通過JDialog點擊事件,以便下面的遊戲接收它們而不是我的JDialog。現在我已將它設置爲undecorated,並且如果單擊實際的十字線圖形,它只會收到點擊事件。

編輯:我創建了一個外部遊戲的十字準線,不是我自己的。

+1

爲什麼要用JDialog來做類似的事情?這完全是倒退。 – Kayaman

+0

我在這方面沒有經驗,你能推薦一種替代方案嗎? –

回答

0

這可以幫助:

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 
+0

我仍然無法點擊它,我的鼠標光標變得可見,當我點擊底層遊戲時沒有發生任何事情,也就是目前我如何繪製十字準線。 –

+0

那麼爲什麼你需要對話框?也許你可以刪除它?對於你的問題:另一種選擇是你捕捉對話框中的mouseevent。並調用像panel.myOnClickMethod(clickX + dialogOffset,clickY + dialogOffset) –

+0

我需要對話框來獲取圖形對象來繪製。 –

0

我發現這是可以實現的使用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; 
}