Java Mac:mouseadapter的全屏JFrame键绑定丢失
在我的Mac电脑上,全屏JFrames最初的键绑定不起作用,每次我尝试键入时,计算机都会发出警报蜂鸣声。不过,在完全初始化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设置为三个选项中的每一个都没有帮助 我
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?对不起,我已经有一段时间没有编辑此应用程序了,但如果我尝试过,我会在这里给出答案。