JFrame Bug Обходной путь - PullRequest
0 голосов
/ 08 мая 2018

Я обнаружил что-то странное при программировании приложения: Я хотел, чтобы JFrame был помещен на весь экран. Он отлично работает с этим кодом:

public class NativeFunctions extends JFrame {

    public NativeFunctions() throws HeadlessException {
        this.setUndecorated(true);
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setBackground(new Color(0, 0, 0));
        this.setVisible(true);
    }

    public static void main(String[] args) {
        NativeFunctions n = new NativeFunctions();
    }
}

Когда я просто изменяю строку кода, которая устанавливает цвет на цвет с альфа-значением, все становится странным:

public class NativeFunctions extends JFrame {

    public NativeFunctions() throws HeadlessException {
        this.setUndecorated(true);
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setBackground(new Color(0, 0, 0, 20));
        this.setVisible(true);
    }

    public static void main(String[] args) {
        NativeFunctions n = new NativeFunctions();
    }
}

При запуске первого приложения JFrame открывается и закрывает экран - как и ожидалось. Попробуйте переместить мышь в верхний левый, верхний правый, нижний правый или нижний левый угол и нажмите клавишу мыши. Ничего не случится. Сделайте то же самое со вторым приложением (со значением альфа), и щелчок будет зарегистрирован. Но это происходит только в самом дальнем углу!

Можете ли вы воспроизвести это и сказали бы, что это ошибка? У вас есть идея для обхода?

Редактировать: Также важно: Для всех значений прозрачности одинаковы! Работает только в самом дальнем углу, а не в середине приложения, поэтому щелчок мыши обычно не передается!

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

После долгого тестирования я выяснил, что это за "ошибка". В Java нет ошибки, но, как ни странно, это было связано с Netbeans. Всякий раз, когда я запускал программу из Netbeans, она не работала (произошло то, что я описал в моем вопросе), но когда я запустил файл .jar, он работал отлично!

0 голосов
/ 08 мая 2018

(со значением альфа) и щелчок будет зарегистрирован. Но это происходит только в самом дальнем углу!

Вам необходимо определить «зарегистрированный».

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

Я ожидаю, что это произойдет с частичной прозрачностью (альфа значения от 1 до 255).

Однако при альфа-значении 0 событие мыши игнорируется приложением Swing и передается на рабочий стол.

Так, например, если я нажимаю внизу / слева, где находится кнопка «Пуск» Windows, я вижу всплывающее меню «Пуск».

Если я щелкаю в другом месте, то приложение, на которое я нажимаю, теперь активируется и становится активным окном.

Нет никакого различия между «самым дальним углом» (как вы это определяете?) И щелчком в центре экрана.

У вас есть идея для обхода?

Полагаю, вы хотите предотвратить передачу события мыши на destop, когда у вас есть альфа-значение от 1 до 255.

Вы пытались добавить MouseListener к фрейму?

Может быть, вы можете попробовать добавить GlassPane к кадру и добавить MouseListener в GlassPane?

...