在Windows下的JFrame中禁用默认ALT键操作

时间:2009-11-12 15:08:16

标签: java windows swing

我想让我的JFrame在Windows 下按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);
    }
}

然后按下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);
    }
}

当我从上面的示例中删除UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())时,按下ALT键时不会显示此行为:未选择菜单,但JFrame

什么时候不看&设置感觉,使用“金属”外观。通过查看上一个示例中的菜单栏可以清楚地看到,当您从中删除UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())时,您将从“原生外观”转到“金属外观”码。但是,无论外观如何,我都看不到JFrame的变化。感觉我设置,它看起来像一个原生的Windows框架。

所以,我的问题是:如何在我的JFrame上禁用此ALT行为?我想我可以通过实际改变JFrame的外观来实现。那可能吗?如果是这样,怎么样?

谢谢!

3 个答案:

答案 0 :(得分:6)

仅限历史:

你可以这样做。窗口管理器处理当前键盘焦点管理器的所有事件,并决定如何处理特定键。每个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);
        }
    });

答案 1 :(得分:1)

听起来你正在与Windows窗口管理器进行一些默认交互。如果您绘制自己的标题栏和边框,Windows可能不再在Alt键上设置这些默认处理程序。

您可能想尝试Substance,这样可以更好地控制这些事情,同时仍然可以使用标准的Swing组件。

或者,在使框架可见之前尝试此操作:

JFrame.setDefaultLookAndFeelDecorated(true);

答案 2 :(得分:1)

实际上,你在这里看到的几乎就在你漂亮的Swing-y Java世界之外。窗口框架(MDI接口除外)总是由底层操作系统的窗口管理器绘制。这也是 Alt 键表现得像你观察到的原因。在这种情况下,WM会拦截此密钥,并确定您要调出程序的系统菜单。这与Java完全无关。

由于多种原因,你不能改变窗框的“外观和感觉”,主要的是这是在Swing的PLAF系统之外。您可以移除窗框,留下一个裸露的窗户(在寒冷的十一月风中冻结),然后您也不应该再获得系统菜单。

此外,你可以尝试处理 Alt 按键,而不是进一步委托非常按键(应用程序在WM之前获取它,所以你可以弄乱这些东西) 。我的Java-Fu现在有点生疏,所以不知道是否以及如何实现这一目标。