在我的 Mac 上,全屏 JFrame 最初具有不起作用的键绑定,并且每次我尝试键入时计算机都会输出警报哔声。不过,有一个解决方法,在完全初始化我的 JFrame 之后,我添加了这些代码行并且所有错误都停止了:
setVisible(false);
setVisible(true);
这是此解决方法的来源:http: //mail.openjdk.java.net/pipermail/macosx-port-dev/2012-November/005109.html
另一个有待解决的问题是将鼠标适配器添加到我的全屏 JFrame 应用程序中。每当我单击时,焦点都会改变——我无法完全确定在哪里,但是将我的键绑定的输入映射设置为三个选项中的每一个都没有帮助。
我什至尝试在单击鼠标时通过添加以下内容来重做解决方法: 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 发布的全屏示例,我还发现无法同时使用键绑定、全屏和鼠标适配器。