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); 
    } 
    } 

如果有人可以帮助;编号非常感激:]

+0

聚焦某物时按下空格键单击按钮并检查或清除复选框。你有没有这样的事情,用户可能会不知不觉地专注于此,并将改变为主页框架? –

+0

在我所有的面板中,有一个选项可以返回到大型机(除了我的店面) 如果按下HOME,那么按下空格键会自动执行操作? – Kenny

+0

没错。如果这是一个'JButton',你可能想调用'setFocusable(false)'来防止它被空格键'点击'。 –

你看看KeyBindings,那么简单,可能这一个,例如(基于3.HFOE的代码,谢谢),其余部分可能是阻止值setEnabledJButtons的第一和最后的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