Bar*_*ers 5 java windows swing
我想,让我在Windows下的JFrame 不经的行为ALT按键.为了澄清,当您执行以下代码片段时:
import javax.swing.*;
public class FrameTest {
public static void main(String[] args) throws Exception {
JFrame frame = new JFrame();
frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
然后ALT按键然后arrow down按键,你会在左上角看到一个菜单,你可以选择最小化,移动,关闭等框架(至少我明白了).我想禁用它:即.JFrame不应该"听"这些ALT印刷机.
我相信某些Windows组件默认响应ALT键,因为当我向框架添加菜单栏并明确设置外观和感觉时,菜单(File)现在会在按下ALT键后自动选择:
import javax.swing.*;
public class FrameTest {
public static void main(String[] args) throws Exception {
JFrame frame = new JFrame();
frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("File");
menuBar.add(menu);
frame.setJMenuBar(menuBar);
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // set Windows look and feel
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
当我UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())从上面的示例中删除时,按下ALT键时不会出现此行为:未选择菜单,但JFrame 是.
如果没有设置外观,则使用"金属"外观.通过查看前一个示例中的菜单栏可以清楚地看到,当您从代码中删除时,您将从"本机外观"变为"金属外观"UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()).但是,我没有看到JFrame的变化,无论我设置什么外观和感觉,它总是看起来像一个原生的Windows框架.
所以,我的问题是:如何ALT在我的JFrame上禁用此行为?我想我可以通过实际改变JFrame的外观来实现.那可能吗?如果是这样,怎么样?
谢谢!
仅为历史:
你可以这样做.窗口管理器处理当前键盘焦点管理器的所有事件,并决定如何处理特定键.每个swing应用程序只有一个键盘焦点管理器,这就是为什么您的更改将影响整个应用程序而不是特定帧.下面的代码应该可以解决问题:
frame.addFocusListener(new FocusListener() {
private final KeyEventDispatcher altDisabler = new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
return e.getKeyCode() == 18;
}
};
@Override
public void focusGained(FocusEvent e) {
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(altDisabler);
}
@Override
public void focusLost(FocusEvent e) {
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(altDisabler);
}
});
Run Code Online (Sandbox Code Playgroud)
实际上,您在这里看到的内容几乎超出了您美好的 Swing-y Java 世界。窗口框架(MDI 界面除外)将始终由底层操作系统的窗口管理器绘制。这也是键的行为如您所观察到的原因Alt。在本例中,该键被 WM 拦截,它决定您要调出程序的系统菜单。这与Java完全无关。
由于多种原因,您无法更改窗框的“外观和感觉”,最主要的原因是它位于 Swing 的 PLAF 系统之外。你可以拆掉窗框,留下一个裸露的窗户(在十一月的寒风中结冰),那么你也不应该再看到系统菜单了。
此外,您可以尝试处理Alt按键,而不是进一步委派该按键(应用程序在 WM 之前获取它,因此您可以搞乱这些事情)。不过,我的 Java-Fu 现在有点生疏,所以不知道是否以及如何实现这一点。