Java Mac:mouseadapter的全屏JFrame键绑定丢失

Java Mac:mouseadapter的全屏JFrame键绑定丢失,java,macos,swing,jframe,fullscreen,Java,Macos,Swing,Jframe,Fullscreen,在我的Mac电脑上,全屏JFrames最初的键绑定不起作用,每次我尝试键入时,计算机都会发出警报蜂鸣声。不过,在完全初始化JFrame之后,我添加了以下代码行,所有错误都停止了: setVisible(false); setVisible(true); 以下是此解决方法的来源: 另一个有待解决的问题是在我的全屏JFrame应用程序中添加鼠标适配器。每当我单击时,焦点都会发生变化——我不太清楚是在哪里,但将keybindings的inputmap设置为三个选项中的每一个都没有帮助 我

在我的Mac电脑上,全屏JFrames最初的键绑定不起作用,每次我尝试键入时,计算机都会发出警报蜂鸣声。不过,在完全初始化JFrame之后,我添加了以下代码行,所有错误都停止了:

   setVisible(false);
   setVisible(true);
以下是此解决方法的来源:

另一个有待解决的问题是在我的全屏JFrame应用程序中添加鼠标适配器。每当我单击时,焦点都会发生变化——我不太清楚是在哪里,但将keybindings的inputmap设置为三个选项中的每一个都没有帮助

我甚至尝试在单击鼠标时通过添加以下内容来重做解决方法: event.getComponent().setVisible(false); event.getComponent().setVisible(true); 但是没有用

这里是问题的一个SSCE(它只会出现在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键,然后单击,然后再次执行,则该操作将不起作用。escape键也是如此:如果单击然后尝试使用它,它将不起作用


是垃圾神发布的全屏的一个例子,我发现不能同时使用键绑定、全屏和鼠标适配器。

每次我尝试键入时,计算机都会发出警报蜂鸣声,我不使用Mac,但我注意到构造函数中的requestFocusInWindow()方法。这没有任何作用,因为您只能请求关注显示在可见GUI上的组件。因此,在将帧设置为全屏(而不是设置为不可见/可见)后,可以尝试调用该方法。对我来说,听起来很喜欢它的嘟嘟声,因为没有任何组件有焦点。是的,我只是编辑了我的问题,因为它不够清楚,我已经解决了这个问题。这是在一个更大的应用程序中的一个小部分的再创造,我肯定在一个可见的GUI上有面板。现在,在我用鼠标点击之后,当我打字的时候没有嘟嘟声,这告诉我一些东西必须有焦点?但是,键绑定没有响应。您有什么想法吗?我仍然对此完全迷茫,这让我发疯。你是否尝试过将鼠标适配器直接添加到JFrame而不是JPanel?对不起,我已经有一段时间没有编辑此应用程序了,但如果我尝试过,我会在这里给出答案。