Принудительно ли JPopupMenu отключать эффекты наведения на его владельца JFrame? - PullRequest
1 голос
/ 06 марта 2011

Когда я щелкаю правой кнопкой мыши на JTable в JFrame, я показываю JPopupMenu. Если я оставлю это JPopupMenu, показанное как есть, и переместу мышью к JTable, я все еще могу зависать над его строками.

Это не стандартное поведение приложений Windows. В обычном случае, если в программе появляется всплывающее меню, оно блокирует любые действия при наведении курсора на всплывающее окно владельца.

Могу ли я сделать то же самое в Java?

Ответы [ 2 ]

1 голос
/ 07 марта 2011

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

Вам нужно будет перехватить все события на стеклянной панели, если наведение включено (всплывающее меню не отображается), вы передадите событие соответствующему компоненту. В противном случае, если hover отключен и MouseEvent, произошедший над JPopupMenu, передается только JPopupMenu.

1 голос
/ 06 марта 2011

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

public MyTable extends JTable {

    private boolean ENABLE_HOVER = true;

    public MyTable() {
    ...
    this.addMouseListener(new MouseListener(){
        ...
        public void mouseClicked(MouseEvent e) {
            if (isRightClick(e)) {
                setHoverEnabled(false);
                showJPopupMenu();
            }
        }
    });
    }

    protected void setHoverEnabled(final boolean hover) {
        this.ENABLE_HOVER = hover;
    }
}
...