我正在用Swing / AWT开发一个桌面应用程序,当出现警报时,它需要排在最前面并获得关注。
在Windows环境中,按照我的需要,在顶层框架上调用toFront()
完全可以,但在MacOS上则不能。
在MacOS中,我将应用程序拉到最前面的唯一成功就是使用
setState(JFrame.NORMAL);
setAlwaysOnTop(true);
setAlwaysOnTop(false);
但这会导致一些非常不正常的行为。首先,该窗口将位于最前面,而不会获得焦点。当单击当前窗口时,菜单栏将显示应用程序的标题和菜单,表明它具有焦点,但是窗口本身仍然在许多方面表现得好像没有焦点一样。具体来说,它仍然具有灰色的风格,即无法聚焦(而不是默认的蓝色),文本框无法聚焦,并且程序无法响应键盘输入。但是,按钮和组合框仍然可以正常使用,尽管没有“单击”视觉响应。我尝试了
的不同组合toFront();
setVisible(true);
requestFocus();
但是这些都没有影响;我发现完全关注该应用程序的唯一方法是单击鼠标左键并将焦点移到另一个窗口,然后单击返回到我的应用程序。我希望用户收到警报后能够立即使用该应用程序,但似乎无法使其正常运行。