私は個人的なプロジェクトを行っています。ボタンの機能の一部は、右クリックしたときに表示されるPopMenu
です。昨日まで働いていたコードですが、今日はOOとなりましたが、MenuItems
をクリックするとメニューは表示されません。私は残念なことにバージョンコントロールを持っていないので、古いバージョンはありません。JMenuItemのActionListenerが機能しません
コードを以下に記載されている:
これは、これが実際のMenuItem
ある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));
}
}
あります。
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;
}
}
この
はここabstract class IListener
ある
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;
}
}
の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
のActionListener
です。
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
は、私のプログラムで使用している他のすべてのための基礎でもあり、問題なく動作しているようです。
私の質問は、MenuItemListener
がマウスクリックによってアクティブになるように修正する必要があることです。
「PopUpListener」クラスを追加できますか? – hamena314
それがなければあなたのコードをテストすることができません。 [mcve]を作成すると、コードをコピーして、マシン上で何が間違っているのかを知ることができます。 – hamena314