java - 如何实现空格键的actionListener作为 Action 事件

标签 java swing keyboard actionlistener actionevent

我将其设置为在计时器上不断更新,但我希望能够使用空格键暂停计时器。我尝试实现一个 actionListener,但我不确定将其应用于什么。我能找到的大多数示例都与按钮或文本框相关,而不是 jpanel 内的键盘按下。我已将 src 打印到控制台,但它似乎没有将我的空格键注册为事件...我尝试添加 actionListener,但我没有得到有关语法的信息。任何帮助将不胜感激。

public class Arena extends JFrame {

private PaintPanel paintPanel;
public Arena() {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setMinimumSize(new Dimension(1000, 720));
    paintPanel = new  PaintPanel();
    getContentPane().add(paintPanel, BorderLayout.CENTER);
    paintPanel.setBackground(Color.black);
    paintPanel.setFocusable(true);
          //paintPanel.addActionListener(this);
    pack();
    paintPanel.initGame();
}



class PaintPanel extends JPanel implements ActionListener {
    private List<Gladiator> gladiators;
    private Timer timer;
    private Ai AI;
    private Load loadObject;


    public void initGame() {

        timer = new Timer(500, this);
        timer.start();
        AI = new Ai(gladiators);
        loadObject = new Load();

    }       
    @Override
    public void actionPerformed(ActionEvent e) {
    Object src = e.getSource();
    System.out.println("*************   "+src);
//      if (src == spacebar) {


//      } else if (src = timer) {


        AI.runAI();     


        try {
        Thread.sleep(100);
        System.out.println("sleeping");
        } catch (InterruptedException d) {
        System.err.println("Caught : InterruptedException" + d.getMessage());
        }


        repaint();
//      }
    }

    public PaintPanel(){
        super();
        gladiators = new ArrayList<Gladiator>();            
        String[][] gladiatorInfo = new String[100][25];
        String[] gladiatorRaw = new String[100];
        String[][] parsedInfo = new String[250][100];
        Gladiator[] gladiator = new Gladiator[20];
        int[] matchInfo = new int[3];
        int numberofcontestants = 0;

        gladiatorRaw = loadObject.getGladiators(gladiatorRaw);
        parsedInfo = loadObject.parseStats(gladiatorRaw);   
        Venue venue = new Venue();
        matchInfo = loadObject.getMatchSettings(matchInfo);
        venue.populateVenue(matchInfo);
        gladiator = createGladiators(venue);

        for (int a = 0; a < venue.contestants; a++) {
        System.out.println("Populating Gladiator "+a);
        gladiator[a].populategladiators(parsedInfo,a);          
        gladiator[a].getEquipment();                
        gladiator[a].contestantNumber = a;
        gladiators.add(gladiator[a]);
        }


    }

    public Gladiator[] createGladiators(Venue venue) {
    int[][] initialPlacement = new int[20][2];
    Gladiator[] gladiator = new Gladiator[(venue.contestants)];
    initialPlacement = loadObject.loadInitialPlacement(venue.contestants);

    for (int a = 0; a < venue.contestants; a++) {
    System.out.println("Add gladiator "+a);
    gladiator[a] = new Gladiator(initialPlacement[a][0],initialPlacement[a][1]);
    System.out.println(initialPlacement[a][0]+","+initialPlacement[a][1]);

    }   
    return gladiator;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;

        try {       
        BufferedImage background = ImageIO.read(new File("background.png"));
        g.drawImage(background,0,0,this);
        } catch (IOException e) {
            System.err.println("Caught IOException: " + e.getMessage());
        }

        for (Gladiator s : gladiators){
            s.draw(g2); 
        }
    }
}
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            Arena gamePanel = new Arena();
            gamePanel.setVisible(true);

        }
    });
}
}

另外,空格键有 getEvent() 键代码吗?好像找不到啊谢谢

最佳答案

您应该使用key bindings API

 InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
 ActionMap am = getActionMap();

 im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "space");
 am.put("space", new AbstractAction() {
     public void actionPerformed(ActionEvent evt) {
         if (timer.isRunning()) {
             timer.stop();
         } else {
             timer.start();
         }
     }
 });

InputMap/ActionMap 可以应用于从 JComponent 扩展的任何组件,但就您而言,我建议附加它到您的PaintPane

关于java - 如何实现空格键的actionListener作为 Action 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16926614/

相关文章:

keyboard - 检测VB6中存在的键盘

java - 如何将 InputMethodService 与服务连接?

java - 这是 Java 正则表达式实现中的错误吗?

java - Servlet控制多个请求

java - X?量数 : Why does a non-x give a "zero-length" match?

java - 无法找到 'org.springframework.http.codec.ServerCodecConfigurer' 类型的 bean

java - 当我尝试从 getter 获取数据时,为什么会收到 NullPointerException?

java - 物质和 MacOS 菜单栏

来自文件路径的 Java JTree 目录结构

python - 热键的输出与预期不同