0

メニューバーを備えたメイン GUI と、メイン GUI の一部をフルスクリーン排他モードで表示する別のフルスクリーン フレームを持つアプリケーションがあります。フルスクリーン モードのとき、メニュー バーのドロップダウン メニューを jpopupmenu としてバインドしたいと考えています。

Swing は、JMenu で関数 getPopupMenu() を提供します。この機能は一見問題ないように見えます。メニュー項目にカーソルを合わせると、サブメニューに移動して表示できます。サブメニューにカーソルを合わせるとサブメニューが強調されますが、プレーンなメニューアイテム (またはラジオボタンメニューアイテムまたはチェックボックスメニューアイテム) にカーソルを合わせてもアイテムは強調されません。ただし、実際にはメニュー項目をクリックできません。ただし、キーボード ショートカットは実際には問題なく機能します。この問題は、このフォーラムで提示されたものと基本的に同じです (ただし、問題は解決されていません)。

http://www.java-forums.org/new-java/16463-jmenu-jpopupmenu.html

メニューバーが初期化され、メイン GUI で使用/表示された後に JMenuItem を追加すると (したがって、フルスクリーン フレームに切り替えるとき)、メニュー項目は実際にクリック可能になります。このメニュー項目は、メイン GUI のメニューバーでもクリック可能です。jMenu を初期化した直後に getPopupMenu() を実行しても、何も変わりません。全画面排他モードを使用しなくても、問題は何も変わりません。

編集

私はいくつかの重要な情報を忘れているようです: 私は Mac OSX でアプリをテストしており、以下を使用しています: System.setProperty("apple.laf.useScreenMenuBar", "true");

メニュー バーを作成するには、ネイティブ メニューバーを使用します。これを無効にすると、ポップアップ メニューは期待どおりに機能します。これは、Mac Java API のバグのようですか? これを克服する方法はありますか?

これについて言及するのを忘れてしまったことをお詫びします。これが何かに影響を与えるとは知りませんでした (明らかなように思えますが)。

4

1 に答える 1

2

わかりました、おそらく何かが欠けていますが、これを非常に迅速にハックして問題はありません

public class PopupFrame extends javax.swing.JFrame {

    /**
     * Creates new form PopupFrame
     */
    public PopupFrame() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jMenuBar1 = new javax.swing.JMenuBar();
        mnuFile = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem3 = new javax.swing.JMenuItem();
        jMenuItem4 = new javax.swing.JMenuItem();
        jMenuItem5 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                doMouseClicked(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                doMouseClicked(evt);
            }
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                doMouseClicked(evt);
            }
        });

        mnuFile.setText("File");

        jMenuItem1.setText("New");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                doActionPerformed(evt);
            }
        });
        mnuFile.add(jMenuItem1);

        jMenuItem2.setText("Open");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                doActionPerformed(evt);
            }
        });
        mnuFile.add(jMenuItem2);

        jMenuItem3.setText("Save");
        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                doActionPerformed(evt);
            }
        });
        mnuFile.add(jMenuItem3);

        jMenuItem4.setText("Close");
        jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                doActionPerformed(evt);
            }
        });
        mnuFile.add(jMenuItem4);

        jMenuItem5.setText("Exit");
        jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                doActionPerformed(evt);
            }
        });
        mnuFile.add(jMenuItem5);

        jMenuBar1.add(mnuFile);

        setJMenuBar(jMenuBar1);

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(0, 278, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>

    private void doActionPerformed(java.awt.event.ActionEvent evt) {

        JMenuItem mi = (JMenuItem) evt.getSource();

        JOptionPane.showMessageDialog(this, "Clicked " + mi.getText());

    }

    private void doMouseClicked(java.awt.event.MouseEvent evt) {

        if (evt.isPopupTrigger()) {

            JPopupMenu popupMenu = mnuFile.getPopupMenu();
            popupMenu.show(this, evt.getX(), evt.getY());

        }

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(PopupFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(PopupFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(PopupFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(PopupFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new PopupFrame().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JMenuItem jMenuItem5;
    private javax.swing.JMenu mnuFile;
    // End of variables declaration
}

申し訳ありませんが、生後 3 か月の子供が昼寝をしている間に組み立てなければならなかったので、手早くて醜い :P

アップデート

いろいろ試してみたところ、ポップアップを自分で呼び出したときに、ポップアップの親参照 ( invoker) を変更していたようです。つまり、ポップアップJMenuを表示しようとすると、コンテキストがすべて間違っていました。

doActionPerformedメソッドを次のように更新しました。

JOptionPane.showMessageDialog(this, "Clicked " + mi.getText());
JPopupMenu popupMenu = mnuFile.getPopupMenu();
popupMenu.setInvoker(mnuFile);

基本的に、ポップアップのクライアント参照を休ませます。

于 2012-07-27T23:48:25.680 に答える