Я работаю над личным проектом, и часть функциональности кнопок состоит в том, что они отображаются в PopMenu
, когда их щелкают правой кнопкой мыши. Код работал до вчерашнего дня, но сегодня я попытался сделать его более OO, и теперь, хотя в меню ничего не появляется, я нажимаю MenuItems
. У меня, к сожалению, нет контроля версий, поэтому у меня нет старой версии для вас.The ActionListener JMenuItem не работает
код приведен ниже:
Это PopUpMenu
класс
public class PopUpMenu extends JPopupMenu {
private Container parent;
public PopUpMenu(MenuItem[] menuItems) {
super();
for (MenuItem item : menuItems) {
add(item);
}
}
public Container getParent() {
return parent;
}
public void setParent(Container parent) {
this.parent = parent;
parent.addMouseListener(new PopUpListener(this));
}
}
Это фактическое MenuItem
.
public class MenuItem extends JMenuItem {
private String methodName;
public MenuItem(String methodName, String text) {
super(text);
setMethodName(methodName);
setFocusable(true);
addActionListener(new MenuItemListener());
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
}
Это ActionListener
из MenuItem
public class MenuItemListener extends IListener {
protected void action(ActionEvent event) {
Object source = event.getSource();
if (source instanceof MenuItem) {
MenuItem item = (MenuItem) source;
Container parent = item.getParent();
if (parent instanceof PopUpMenu) {
PopUpMenu menu = (PopUpMenu) parent;
Container container = menu.getParent();
try {
String name = item.getMethodName();
Method method = container.getClass().getMethod(name);
method.invoke(container);
} catch (Exception e) {
}
}
}
}
}
этого ActionListener
из PopUpMenu
public class PopUpListener extends MouseAdapter {
private PopUpMenu menu;
public PopUpListener(PopUpMenu menu) {
setMenu(menu);
}
public void mouseReleased(MouseEvent event) {
if (event.isPopupTrigger()) {
menu.show(event.getComponent(), event.getX(), event.getY());
}
}
public PopUpMenu getMenu() {
return menu;
}
public void setMenu(PopUpMenu menu) {
this.menu = menu;
}
}
Вот abstract class IListener
.
public abstract class IListener implements ActionListener {
private boolean keyboardSensitive;
public IListener() {
setKeyboardSensitive(false);
}
@Override
public void actionPerformed(ActionEvent event) {
if ((event.getModifiers() != 0) || isKeyboardSensitive()) {
action(event);
}
}
protected abstract void action(ActionEvent event);
public boolean isKeyboardSensitive() {
return keyboardSensitive;
}
public void setKeyboardSensitive(boolean keyboardSensitive) {
this.keyboardSensitive = keyboardSensitive;
}
}
После небольшого тестирования я обнаружил, что ActionListener
фактически активируется нажатых клавиш, но не любой кнопкой мыши, (найденный путем удаления, если во время отладки), которые не очень полезно, так как вы может видеть в классе IListener. Я не хочу принимать какие-либо события, поступающие с клавиатуры.
IListener
также является базой для всех остальных ActionListeners
Я использую в своей программе и, похоже, отлично работает для них.
В сущности, мой вопрос: что мне нужно исправить, чтобы активировать MenuItemListener
щелчками мыши?
Можете выложить класс 'PopUpListener', пожалуйста? – hamena314
Без этого я не могу проверить ваш код. Когда вы создаете [mcve], люди могут просто скопировать ваш код и посмотреть, что может быть не так с ним на их машине. – hamena314