Mac:全屏JFrame丢失了来自mouseadapter的键绑定

时间:2013-11-04 06:22:12

标签: java macos swing jframe fullscreen

在我的Mac上,全屏JFrame最初具有不起作用的键绑定,并且每次我尝试键入时计算机都会发出警报声。但是,有一种解决方法,在完全初始化我的JFrame之后,我添加了这些代码行并且所有错误都停止了:

   setVisible(false);
   setVisible(true);

以下是此解决方法的来源:http://mail.openjdk.java.net/pipermail/macosx-port-dev/2012-November/005109.html

另一个尚未解决的问题是在我的全屏JFrame应用程序中添加鼠标适配器。每当我点击时,焦点都会改变 - 我无法分辨的地方,但是将我的键绑定的输入映射设置为三个选项中的每一个都无济于事。

我甚至尝试通过添加以下内容来单击鼠标时重做变通方法:             。event.getComponent()调用setVisible(假);             。event.getComponent()调用setVisible(真); 但无济于事。

以下是问题的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键,然后单击,然后再次执行,则无效。对于转义键也是如此:如果您单击然后尝试使用它,它将无法工作。

here是trashgod发布的全屏显示示例,我也发现无法同时使用键绑定,全屏和鼠标适配器。

0 个答案:

没有答案