События MouseMotionListener не срабатывают в определенных областях экрана

Следующий класс демонстрирует мою проблему с MouseMotionListeners в FSEM.

public class TestGUI extends JFrame {

Panel panel;

public TestGUI()
{
    panel = new Panel();
    GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    gd.setFullScreenWindow(this);
    setVisible(false); // use the workaround to the Mac OS X FSEM bug where mouseMotionListeners don't work right away
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    getContentPane().add(panel);
    setVisible(true);
}

class Panel extends JPanel
{
    public Panel()
    {
        addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseMoved(MouseEvent e)
            {
                Toolkit.getDefaultToolkit().beep();
            }
        });
        setVisible(true);
    }
}

public static void main(String[] args) {
    new TestGUI();
}
}

Проблема в следующем: я отчетливо слышу, когда срабатывает mouseEvent из-за вызова Toolkit.getDefaultToolkit().beep(); в обработчике событий. Обработчик событий отлично работает на большей части экрана, за исключением области экрана, которая обычно имеет ссылку док-станция для Mac OS X. Я подтвердил это, закрепив док-станцию ​​на разных сторонах экрана, и «мертвая зона» изменилась на ту сторону экрана, к которой я прикрепил док-станцию. Есть ли обходной путь для этого?

Моя установка:

Версия Java: 1.7.0_55.

Версия Mac OS X: 10.8.5.


person BitNinja    schedule 09.07.2014    source источник
comment
Установите фон окна, чтобы убедиться, что он заполняет всю область. Это может быть ограничение Mac OS   -  person MadProgrammer    schedule 10.07.2014
comment
Вы также можете рассмотреть возможность использования собственного полноэкранного API Mac OS, как показано здесь   -  person MadProgrammer    schedule 10.07.2014
comment
@MadProgrammer Установка цвета фона делает очевидным, что вся область экрана покрыта.   -  person BitNinja    schedule 10.07.2014
comment
Может быть невидимое системное окно, которое используется для обнаружения движения мыши над областью панели док-станции. Рассмотрите возможность использования com.apple.eawt.Application.requestToggleFullScreen(Window) API вместо этого.   -  person MadProgrammer    schedule 10.07.2014


Ответы (1)


Задача решена. Решение состоит в том, чтобы установить кадр undecorated(true); прямо перед его установкой в ​​качестве полноэкранного окна.

public TestGUI()
{
    panel = new Panel();
    GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    setUndecorated(true);
    gd.setFullScreenWindow(this);
    setVisible(false); // use the workaround to the Mac OS X FSEM bug where mouseMotionListeners don't work right away
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    getContentPane().add(panel);
    setVisible(true);
}

Возможно, перед причалом была какая-то невидимая вещь, не оконная.

person BitNinja    schedule 10.07.2014