Качать всплывающее меню на компонент и его содержимое
У меня есть компонент (Widget - расширяет JPanel), в котором я реализовал простое всплывающее меню. Он работает при нажатии на границу панели и практически везде, кроме тех мест, где макет панели содержит какой-либо другой компонент внутри панели.
Поэтому, если внутри панели есть JTable, я могу вызвать меню, щелкнув рядом с ним (если больше ничего нет), но при нажатии на JTable ничего не происходит (таблица явно находится на верхней части панели, не позволяя MouseAdapter зарегистрировать клик).
Можно ли как-нибудь вызвать всплывающее меню при щелчке правой кнопкой мыши даже на компонентах внутри панели? Вот пример кода, как я создаю и вызываю меню:
private void initPopupMenu() {
popup = new JPopupMenu();
JMenuItem closeItem = new JMenuItem("Close");
closeItem.setActionCommand(WidgetConstants.Actions.CLOSE.name());
closeItem.addActionListener(this);
popup.add(closeItem);
JMenuItem minimizeItem = new JMenuItem("Minimize");
minimizeItem.setActionCommand(WidgetConstants.Actions.MINIMIZE.name());
minimizeItem.addActionListener(this);
popup.add(minimizeItem);
}
MouseInputListener componentListener = new MouseInputAdapter() {
@Override
public void mousePressed(MouseEvent me) {
// popup
if (me.isPopupTrigger()) {
popup.show(me.getComponent(), me.getX(), me.getY());
}
}
@Override
public void mouseReleased(MouseEvent ev) {
if (ev.isPopupTrigger()) {
popup.show(ev.getComponent(), ev.getX(), ev.getY());
}
}
}
@Override
public void setBorder(Border border) {
removeMouseListener(componentListener);
removeMouseMotionListener(componentListener);
if (border instanceof WidgetBorder) {
addMouseListener(componentListener);
addMouseMotionListener(componentListener);
}
super.setBorder(border);
}
Спасибо за любые советы.
1 ответ
Прежде всего: вам не нужно использовать мышь слушателя. У каждого JComponent есть свой метод setComponentPopupMenu(JPopupMenu)
, Secon: вы можете просматривать дерево компонентов и регистрировать всплывающее меню для каждого компонента.
Вот пример:
/**
* Provides component hierarchy traversal.
*
* @param aContainer start node for the traversal.
*/
private void traverse(Container aContainer, JPopupMenu aMenu) {
for (final Component comp : aContainer.getComponents()) {
if (comp instanceof JComponent) {
((JComponent) comp).setComponentPopupMenu(aMenu);
}
if (comp instanceof Container) {
traverse((Container) comp, aMenu);
}
}
}