Вы, вероятно, вручную вызываете setVisible(true)
меню. Это может вызвать некоторые неприятные ошибки в меню.
Этот show(Component, int x, int x)
метод обрабатывает все, что вам нужно (выделение элементов при наведении курсора мыши и закрытие всплывающего окна при необходимости), при использовании которого setVisible(true)
просто отображается меню без добавления какого-либо дополнительного поведения.
Чтобы создать всплывающее меню при щелчке правой кнопкой мыши, просто создайте файл JPopupMenu
.
class PopUpDemo extends JPopupMenu {
JMenuItem anItem;
public PopUpDemo() {
anItem = new JMenuItem("Click Me!");
add(anItem);
}
}
Затем все, что вам нужно сделать, это добавить пользовательские настройки MouseListener
к компонентам, для которых вы хотите отображать всплывающее меню.
class PopClickListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger())
doPop(e);
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger())
doPop(e);
}
private void doPop(MouseEvent e) {
PopUpDemo menu = new PopUpDemo();
menu.show(e.getComponent(), e.getX(), e.getY());
}
}
// Then on your component(s)
component.addMouseListener(new PopClickListener());
Конечно, в руководствах есть более подробное объяснение.
Примечание: Если вы заметили , что всплывающее меню появляется поодаль от того, где пользователя нажал, попробуйте использовать e.getXOnScreen()
и e.getYOnScreen()
методы для координат х и у.
PopClickListener
расширяетсяMouseAdapter
?component
?Этот вопрос немного устарел - как и ответы (и само руководство)
Текущий api для настройки popupMenu в Swing:
Таким образом, он будет отображаться автоматически, как для триггеров мыши, так и для клавиатуры (последнее зависит от LAF). Кроме того, он поддерживает повторное использование одного и того же всплывающего окна для дочерних элементов контейнера. Чтобы включить эту функцию:
источник
JTable
чтобы он появлялся в выбранной строке или в строке, где вы щелкаете правой кнопкой мыши? Или в этом сценарии следует выбрать старый метод?В статье « Как использовать меню» учебников по Java есть раздел « Вызов всплывающего меню», в котором объясняется, как использовать этот класс.
JPopupMenu
В примере кода в руководстве показано, как добавить
MouseListener
s к компонентам, которые должны отображать всплывающее меню и соответственно отображать меню.(Метод, который вы описываете, довольно похож на способ, которым в учебнике представлен способ отображения всплывающего меню в компоненте.)
источник
Следующий код реализует контекстное меню по умолчанию, известное из
Windows
функций копирования, вырезания, вставки, выбора всего, отмены и повтора. Он также работаетLinux
иMac OS X
:Использование:
Теперь при
textArea
щелчке правой кнопкой мыши у него будет контекстное меню.источник
releasedEvent.isPopupTrigger()
вместо того,releasedEvent.getButton() == MouseEvent.BUTTON3
чтобы правильно работать на всех платформах.pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
либо оба, либоEx
нетEx
.Ex
ВерсияgetMenuShortcutKeyMask()
доступна только с Java 10+.Я исправлю использование этого метода, предложенного @BullyWillPlaza. Причина в том, что когда я пытаюсь добавить textArea только в contextMenu, он не отображается, и если я добавляю его как в contextMenu, так и в какую-то панель, он обнаруживает: Другая родительская двойная ассоциация, если я пытаюсь переключиться в редактор дизайна.
Сделайте такой слушатель мыши для текстового объекта, который вам нужен. Это произойдет, если вы щелкнете правой кнопкой мыши по текстовому объекту, и тогда всплывающее окно добавится и отобразится. Таким образом, вы не столкнетесь с этой ошибкой. Решение, созданное @BullyWillPlaza, очень хорошее, богатое и быстрое для реализации в вашей программе, поэтому вы должны попробовать его, чтобы увидеть, как оно вам нравится.
источник