2 回答
TA贡献1796条经验 获得超4个赞
我遇到了同样的问题,并通过使用 Windows API 对窗口进行子类化来解决它。如果你被允许使用 JNA,下面的代码会对你有所帮助。
我的用户32.java
import com.sun.jna.Callback;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.*;
import com.sun.jna.win32.W32APIOptions;
public interface MyUser32 extends User32 {
int WM_MENUCHAR = 0x0120;
int MNC_CLOSE = 1;
int VK_RETURN = 0x0d;
MyUser32 INSTANCE = Native.loadLibrary("user32", MyUser32.class, W32APIOptions.UNICODE_OPTIONS);
LONG_PTR SetWindowLongPtr(WinDef.HWND hWnd, int nIndex, Callback callback);
LRESULT CallWindowProc(LONG_PTR lpPrevWndProc, HWND hWnd, int Msg, WPARAM wParam, LPARAM lParam);
}
App.java
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.WinDef.*;
import com.sun.jna.win32.StdCallLibrary;
import javafx.application.Application;
import javafx.stage.Stage;
import java.lang.reflect.Method;
public class App extends Application implements StdCallLibrary.StdCallCallback {
private BaseTSD.LONG_PTR baseWndProc;
public static void main(String[] args) { launch(args); }
@Override
public void start(Stage primaryStage) {
// set up scene ...
primaryStage.show();
final HWND hWnd = new HWND(getWindowPointer(primaryStage));
baseWndProc = MyUser32.INSTANCE.SetWindowLongPtr(hWnd, User32.GWL_WNDPROC, this);
}
public LRESULT callback(HWND hWnd, int Msg, WPARAM wParam, LPARAM lParam) {
if (Msg == MyUser32.WM_MENUCHAR && (wParam.longValue() & 0xffff) == MyUser32.VK_RETURN) {
return new LRESULT(MyUser32.MNC_CLOSE << 16);
}
return MyUser32.INSTANCE.CallWindowProc(baseWndProc, hWnd, Msg, wParam, lParam);
}
private Pointer getWindowPointer(Stage stage) {
try {
Method getPeer = stage.getClass().getMethod("impl_getPeer");
final Object tkStage = getPeer.invoke(stage);
Method getPlatformWindow = tkStage.getClass().getDeclaredMethod("getPlatformWindow");
getPlatformWindow.setAccessible(true);
final Object platformWindow = getPlatformWindow.invoke(tkStage);
Method getNativeHandle = platformWindow.getClass().getMethod("getNativeHandle");
return new Pointer((Long) getNativeHandle.invoke(platformWindow));
} catch (Throwable t) {
return null;
}
}
TA贡献1827条经验 获得超4个赞
我猜你是在 Windows 中编程,因此你得到的哔声是默认的哔声。
基于此论坛帖子,似乎ALT+KEY
没有找到菜单快捷方式。这很可能是由于Mnemonic Parsing
,它允许您将键盘快捷键添加到菜单项,例如ALT+F
文件、ALT+S
保存等...
根据其中一篇文章,Windows 似乎也想获取该组合键,但找不到它,所以它发出哔哔声。
我不确定您是否可以添加一个ENTER
作为助记符标识符,但您可以通读这篇关于 javafx 助记符的文章,以及关于按钮加速器的这篇文章。我知道第二个是 JavaFx 2.2,但它应该仍然有效。这些应该会给你一些关于如何更彻底地解决这个问题的好主意。
添加回答
举报