0

私の Mac では、最初はフルスクリーンの JFrame に機能しないキー バインドがあり、入力しようとするたびにコンピューターからアラート ビープ音が出力されます。回避策がありますが、JFrame を完全に初期化した後、次のコード行を追加すると、すべてのエラーが停止しました。

   setVisible(false);
   setVisible(true);

この回避策のソースは次のとおりです: http://mail.openjdk.java.net/pipermail/macosx-port-dev/2012-November/005109.html

まだ解決されていないもう 1 つの問題は、フル スクリーンの JFrame アプリケーションにマウス アダプタを追加することです。クリックするたびにフォーカスが変わりました。どこに移動するかはわかりませんでしたが、キーバインドの入力マップを 3 つのオプションのそれぞれに設定しても役に立ちませんでした。

これを追加して、マウスがクリックされたときに回避策をやり直そうとしました: event.getComponent().setVisible(false); event.getComponent().setVisible(true); しかし、役に立たない。

問題の SSCCE を次に示します (Mac でのみ表示されます)。

import java.awt.Dimension;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

public class FocusTest extends JFrame{
    private static final int PREF_W = 400;
    private static final int PREF_H = PREF_W;

    public FocusTest() {
       MyPanelDescendent myPanelDescendent = new MyPanelDescendent();
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       getContentPane().add(myPanelDescendent);
       pack();
       setLocationByPlatform(true);
       setVisible(true);

       KeyStroke escapeKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false);
       Action escapeAction = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
             dispose();
             System.exit(0);
            }
       };
       getRootPane().getInputMap(JComponent.WHEN_FOCUSED).put(escapeKeyStroke, "ESCAPE");
       getRootPane().getActionMap().put("ESCAPE", escapeAction);

       GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
       GraphicsDevice gs = ge.getDefaultScreenDevice();
       gs.setFullScreenWindow(this);

       setVisible(false);
       setVisible(true);
    }
    private class MyPanelAscendent extends JPanel{
        public MyPanelAscendent() {
           setFocusable(true);
           requestFocusInWindow();

             getInputMap(0).put(KeyStroke.getKeyStroke("pressed A"), "pressed");
             getActionMap().put("pressed", new AbstractAction() {
                   @Override public void actionPerformed(ActionEvent e) {
                       if (e.getActionCommand().equalsIgnoreCase("a")) {
                           System.out.println("a was pressed");
                       }
                   }
             });

           addMouseListener(new MyAdapter());
        }
    }
    private class MyPanelDescendent extends MyPanelAscendent {
        public MyPanelDescendent() {
            super();
        }
    }

    private class MyAdapter extends MouseAdapter {

        @Override
        public void mouseClicked(MouseEvent event) {
            event.getComponent().setVisible(false);
            event.getComponent().setVisible(true);
            System.out.println("clicked");
        }
    }

    @Override
    public Dimension getPreferredSize() {
       return new Dimension(PREF_W, PREF_H);
    }



    public static void main(String[] args) {
       SwingUtilities.invokeLater(new Runnable() {
          public void run() {
             new FocusTest();
          }
       });
    }
}

a キーを押してからクリックし、もう一度クリックしても機能しません。同じことがエスケープ キーにも当てはまります。クリックしてから使用しようとしても、機能しません。

これは、trashgod によって投稿されたフルスクリーンの例です。キーバインド、フルスクリーン、およびマウス アダプタの両方を同時に使用することは不可能であることがわかりました。

4

0 に答える 0