Отключить действие клавиши ALT по умолчанию в JFrame под Windows - PullRequest
4 голосов
/ 12 ноября 2009

Я бы хотел, чтобы мой 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.

Итак, мой вопрос: как я могу отключить это ALT поведение на моем JFrame? Я думаю, что могу сделать это, фактически изменив внешний вид JFrame. Это возможно? Если да, то как?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 22 октября 2010

Только для истории:

Вы можете сделать это. Менеджер окон обрабатывает все события для текущего менеджера фокуса клавиатуры и решает, что делать с определенной клавишей. Каждое свинг-приложение имеет только один диспетчер фокуса клавиатуры, поэтому ваши изменения будут влиять на все приложение, а не на конкретный кадр. Код ниже должен сделать трюк:

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 голос
/ 12 ноября 2009

На самом деле, то, что вы видите здесь, в значительной степени находится за пределами вашего прекрасного мира Swing-y Java. Оконная рама (за исключением интерфейсов MDI) будет всегда отображаться диспетчером окон базовой операционной системы. И это также причина, почему клавиша Alt ведет себя так, как вы наблюдаете. Этот ключ перехватывается WM в этом случае, и он решает, что вы хотите вызвать системное меню программы. Это совершенно не связано с Java.

По нескольким причинам вы не можете изменить «внешний вид» оконной рамы, главная из которых заключается в том, что она находится за пределами системы PLAF Swing. Вы можете снять оконную раму, оставив за собой обнаженное окно (замерзшее под холодным ноябрьским ветром), тогда вам также не нужно больше получать системное меню.

Кроме того, вы можете попробовать обработать Alt нажатие клавиши и не делегировать это нажатие далее (приложение получает его раньше, чем WM, так что вы можете связываться с этими вещами). Мой Java-Fu сейчас немного ржавый, так что понятия не имею, можно ли и как этого достичь.

1 голос
/ 12 ноября 2009

Похоже, вы сталкиваетесь с некоторыми взаимодействиями по умолчанию с оконным менеджером Windows. Возможно, что если вы нарисуете свою собственную строку заголовка и границы, Windows больше не будет устанавливать эти обработчики по умолчанию для клавиши Alt.

Возможно, вы захотите попробовать Вещество , которое дает вам гораздо больший контроль над этими вещами, при этом все еще работая со стандартными компонентами Swing.

Или попробуйте сделать это до того, как вы сделаете ваш кадр видимым:

JFrame.setDefaultLookAndFeelDecorated(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...