JAVA JFrames:空格键重置我的游戏
问题描述:
所以我制作了一个游戏,我将使用cardlayouts在帧之间转换。然而,每次我使用我的任务栏调整音量,然后返回到我的游戏中,如果按空格键(这是我的开火按钮),游戏将返回到我的第一帧,即HOME FRAME。JAVA JFrames:空格键重置我的游戏
为什么会发生此问题?我听说它有一些与“可聚焦”有关的内容,但我不确定这意味着什么。
我的JFrame的设置类似于典型JFrames:
public class testAngles {
public static void main(String args[]) throws IOException {
JFrame frame = new JFrame("Angle Tests");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
movements m = new movements();
frame.add(m);
frame.addKeyListener(m);
frame.setSize(800, 600);
frame.setVisible(true);
}
}
如果有人可以帮助;编号非常感激:]
答
你看看KeyBindings,那么简单,可能这一个,例如(基于3.HFOE的代码,谢谢),其余部分可能是阻止值setEnabled
为JButtons
的第一和最后的Cards
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class OnTheFlyImageTest {
private static final long serialVersionUID = 1L;
private JPanel cardPanel;
private CardLayout cardLayout;
private JFrame frame;
public OnTheFlyImageTest() {
JPanel cp = new JPanel(new BorderLayout());
cp.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
cardLayout = new CardLayout(5, 5);
cardPanel = new JPanel(cardLayout);
cp.add(cardPanel);
for (int i = 0; i < 5; i++) {// Create random panels for testing.
String name = "ImagePanel" + (i + 1);
String image = (i & 1) == 0 ? "foo.gif" : "bar.gif";
Color clr = (i & 1) == 0 ? Color.red : Color.blue;
ImagePanel imgPanel = new ImagePanel(name, image, clr);
cardPanel.add(imgPanel, name);
cardLayout.addLayoutComponent(imgPanel, name);
}
JPanel buttonPanel = new JPanel(new GridLayout(1, 2, 5, 5));
JButton prevButton = new JButton("< Previous");
prevButton.setActionCommand("Previous");
prevButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.previous(cardPanel);
}
});
buttonPanel.add(prevButton);
JButton nextButton = new JButton("Next >");
nextButton.setActionCommand("Next");
nextButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.next(cardPanel);
}
});
buttonPanel.add(nextButton);
JPanel temp = new JPanel(new BorderLayout());
temp.add(buttonPanel, BorderLayout.LINE_END);
cp.add(temp, BorderLayout.SOUTH);
frame = new JFrame("CardLayout and KeyBindings");
frame.add(cp);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Test");
frame.pack();
frame.setVisible(true);
setKeyBindings();
}
private void setKeyBindings() {
frame.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
KeyStroke.getKeyStroke("TAB"), "clickTAB");
frame.getRootPane().getActionMap().put("clickTAB", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.show(cardPanel, "ImagePanel" + 1);
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new OnTheFlyImageTest();
}
});
}
}
class ImagePanel extends JPanel {
private static final long serialVersionUID = 1L;
private String imgString;
private JLabel imgLabel;
public ImagePanel(String name, String imgString, Color backGround) {
setName(name);
this.imgString = imgString;
setLayout(new BorderLayout());
setBackground((backGround));
// Ensure size is correct even before any image is loaded.
setPreferredSize(new Dimension(400, 300));
}
@Override
public void setVisible(boolean visible) {
if (visible) {
System.err.println(getName() + ": Loading and adding image");
ImageIcon icon = new ImageIcon(imgString);
imgLabel = new JLabel(icon);
add(imgLabel);
}
super.setVisible(visible);
if (!visible) { // Do after super.setVisible() so image doesn't "disappear".
System.err.println(getName() + ": Removing image");
if (imgLabel != null) { // Before display, this will be null
remove(imgLabel);
imgLabel = null; // Hint to GC that component/image can be collected.
}
}
}
}
+0
因此,使用Keybindings时,我可以让它不在框架(或整个程序)内运行,所有的JButtons或setEnbale(false)? – Kenny
聚焦某物时按下空格键单击按钮并检查或清除复选框。你有没有这样的事情,用户可能会不知不觉地专注于此,并将改变为主页框架? –
在我所有的面板中,有一个选项可以返回到大型机(除了我的店面) 如果按下HOME,那么按下空格键会自动执行操作? – Kenny
没错。如果这是一个'JButton',你可能想调用'setFocusable(false)'来防止它被空格键'点击'。 –