問題が私のコードにあるのか、Java 1.7 にあるのかわかりません。
以下のコード (主に Java Popup Demo に基づく) では、マウスの右クリックでポップアップが表示されます。マウスをロールオーバーするとポップアップ メニュー項目が強調表示され、JmenuItem をクリックするとポップアップが消えます。ただし、JMenuItem の actionEvent はクリックしても発生しません (これは JTextArea で報告される必要があります)。
その他のナゲット: JMenuItem のニーモニック (ここでは「a」) を入力すると、actionEvent が発生します (イベントは JTextArea で報告されます)。
カスタム Popup(Factory) をアタッチしないと、マウス クリックで actionEvent が期待どおりに発生します。
私はOSX 10.7.5を使用しています
この問題は次の場合に発生します。
Java バージョン「1.7.0_07」 Java(TM) SE ランタイム環境 (ビルド 1.7.0_07-b10) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 23.3-b01、混合モード)
このコードは、次の場合に正常に動作します。
Java バージョン「1.6.0_33」 Java(TM) SE ランタイム環境 (ビルド 1.6.0_33-b03-424-11M3720) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 20.8-b03-424、混合モード)
どんな助け/考えも大歓迎です! 自己完結型のコード例を以下に示します。
ありがとう
アンドリュー
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PopupMenuDemo implements ActionListener {
JTextArea output;
JScrollPane scrollPane;
String newline = "\n";
public Container createContentPane() {
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setOpaque(true);
output = new JTextArea(5, 30);
output.setEditable(false);
scrollPane = new JScrollPane(output);
contentPane.add(scrollPane, BorderLayout.CENTER);
return contentPane;
}
public void createPopupMenu() {
JMenuItem menuItem;
JPopupMenu popup = new JPopupMenu();
menuItem = new JMenuItem("A popup menu item", 'a');
menuItem.addActionListener(this);
popup.add(menuItem);
MouseListener popupListener = new PopupListener(popup);
output.addMouseListener(popupListener);
}
public void actionPerformed(ActionEvent e) {
JMenuItem source = (JMenuItem)(e.getSource());
String s = "Action event detected."
+ newline
+ " Event source: " + source.getText()
+ " (an instance of " + source.getClass().getName() + ")";
output.append(s + newline);
output.setCaretPosition(output.getDocument().getLength());
}
private void createAndShowGUI() {
JFrame frame = new JFrame("PopupMenuDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PopupFactory.setSharedInstance(new MyPopupFactory());
PopupMenuDemo demo = new PopupMenuDemo();
frame.setContentPane(demo.createContentPane());
demo.createPopupMenu();
frame.setSize(450, 260);
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new PopupMenuDemo().createAndShowGUI();
}
});
}
class PopupListener extends MouseAdapter {
JPopupMenu popup;
PopupListener(JPopupMenu popupMenu) {
popup = popupMenu;
}
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
class MyPopupFactory extends PopupFactory {
public Popup getPopup(Component owner, Component contents, int x, int y) throws IllegalArgumentException {
return new MyPopup(owner, contents, x, y);
}
}
class MyPopup extends Popup {
private JWindow popupWindow;
MyPopup(Component owner, Component contents, int ownerX, int ownerY) {
popupWindow = new JWindow();
popupWindow.setLocation(ownerX, ownerY);
popupWindow.getContentPane().add(contents, BorderLayout.CENTER);
contents.invalidate();
}
public void show() {
popupWindow.setVisible(true);
popupWindow.pack();
}
public void hide() {
popupWindow.setVisible(false);
popupWindow.removeAll();
popupWindow.dispose();
}
}
}