2015-07-13 4 views
0

У меня есть JDialog, который я хочу использовать в качестве наложения для игры. Диалог просто рисует настраиваемое перекрестье в центре экрана, но очевидно, что, поскольку игры в формате fps имеют тенденцию центрировать курсор игроков, я не могу использовать какое-либо из своих оружия, потому что JDialog просто фокусируется.Как перейти через JDialog?

Как я могу пройти события кликов через JDialog, чтобы игра под ними получала их вместо моего JDialog. Прямо сейчас у меня он установлен на unecorated, и он получает только события щелчка, если я нажимаю фактическую графику перекрестия.

EDIT: Я создал перекрестие для внешней игры, а не свое.

+1

Почему вы используете JDialog для чего-то подобного? Это полностью назад. – Kayaman

+0

Я неопытный в этой области, вы можете порекомендовать альтернативу? –

ответ

0

Это может помочь:

testDialog.setFocusableWindowState(false); 

Отсюда: Stop newly created dialog from taking focus

Кроме того, может быть, это лучше для вас, чтобы получить объект Graphics кадра позади и использовать графики, чтобы нарисовать перекрестие напрямую.

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; 
}