1

問題が私のコードにあるのか、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();
    }
    }
}
4

2 に答える 2

0

まず、MouseListenerポップアップ トリガーを監視するためにa を使用するのをやめJComponent#setComponentPopupMenuます。

第二に、なぜ独自の popup factory を提供したいのかわかりませんが、それが問題を引き起こしています。行をコメントアウトすると、popupWindow.dispose機能します。理由については、教えられませんが、IDE が再生されている可能性があるため、コードをデバッグできません:P

于 2012-10-14T02:51:07.977 に答える