что такое правильная обработка isPopupTrigger () в MouseAdapter - PullRequest
0 голосов
/ 20 января 2020

Мне нужно написать Java Swing-приложение, которое будет работать и примерно одинаково на Linux, Windows и Ma c. И для практически всех создаваемых мной виджетов мне нужно добавить некоторую особую обработку, в том числе все должно иметь возможность открывать меню по запросу. Даже виджеты, такие как метки и кнопки.

Я могу ловить запросы меню, добавляя:

    MouseListener m = new MouseAdapter() {
      @Override
        public void mousePressed(MouseEvent e)
        {
          if (e.isPopupTrigger())
          {
            onMenuSummons(); //do my thing
          }
        }
    };
    addMouseListener(m);

в конструктор моего расширенного виджета.

Но я обеспокоен тем, что это Linux -только решение. Нужно только проверять isPopupEvent () в MousePressed? Как насчет MouseClicked? Я мог бы подключить оба, чтобы быть уверенным, но могу ли я рискнуть, что когда-нибудь на какой-то платформе будет одна функция isPopupEvent () для обеих функций мыши при одном и том же действии мыши?

В идеале MouseAdapter избавит меня от вопроса, предложив перезаписываемый popupRequest (MouseEvent e), но это не так. Так что же всегда правильно, работает везде на всех платформах и всегда будет решением навсегда?

Кроме того, некоторые из виджетов, которые я расширяю, могут иметь свои собственные всплывающие меню; Я должен подавить их и реализовать свои собственные. Как мне убедиться, что отображается только мое собственное меню? ТИА.

1 Ответ

1 голос
/ 20 января 2020

Прочтите раздел из учебника по Swing на Вызов всплывающего меню для основы c использования меню и всплывающих меню.

Для написания MouseListener basi c код:

class PopupListener extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
        maybeShowPopup(e);
    }

    public void mouseReleased(MouseEvent e) {
        maybeShowPopup(e);
    }

    private void maybeShowPopup(MouseEvent e) {
        if (e.isPopupTrigger()) {
            popup.show(e.getComponent(),
                       e.getX(), e.getY());
        }
    }
}

некоторые из виджетов, которые я расширяю, могут иметь свои собственные всплывающие меню; Мне нужно подавить их и реализовать свои собственные.

Также обратите внимание, что пример из руководства более старый. Более новый подход для добавления всплывающего меню к компоненту заключается в использовании:

component.setComponentPopupMenu(....);

Не уверен, но поскольку этот метод допускает только одно всплывающее окно, он может заменить всплывающее окно по умолчанию?

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