等待循环内按下一个键

苏希尔

我有一个Java应用程序,我想等待按下某个键来执行其他操作。直到现在我发现:

public void keyPressed(KeyEvent e) {
  if (e.getKeyCode() == KeyEvent.VK_RIGHT ) {
        //Right arrow key code
  }
}

但我希望这是在循环内或等待键匹配的东西。

请帮忙。

更新:

我希望程序一直等待,直到按下该键为止,并且当我按下该键时,我想触发另一个动作。例如:

public void something(){
  //do something
  wait until a key is pressed
  if( key pressed is a arrow key){
    something();
  }else{
    wait for the key to be pressed
  }
}

public void dootherthing(){
 //do other thing
}

我正在积极工作,我不希望GUI不负责任。即当我通过单击按钮调用做其他事情时。它应该这样做,等待应该结束了。

疯狂程序员

Swing(和大多数GUI)是事件驱动的环境。也就是说,某些事情发生了,您对此做出了反应。

让循环等待某种动作是一种反直观(IMHO)的行为。

一般来说,KeyListener如果可以的话,应避免使用s。他们有重点关注的问题。键绑定API有办法在来此限制。

它允许您KeyStroke针对进行注册Action并允许您的程序坐下来等到发生什么事情...

在此处输入图片说明

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class KeyBindings {

    public static void main(String[] args) {
        new KeyBindings();
    }

    public KeyBindings() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 0;

            add(new KeyPane(KeyEvent.VK_UP, 0), gbc);

            gbc.gridy = 2;
            add(new KeyPane(KeyEvent.VK_DOWN, 0), gbc);

            gbc.gridx = 0;
            gbc.gridy = 1;
            add(new KeyPane(KeyEvent.VK_LEFT, 0), gbc);

            gbc.gridx = 2;
            add(new KeyPane(KeyEvent.VK_RIGHT, 0), gbc);

        }
    }

    public class KeyPane extends JPanel {

        public KeyPane(int keyCode, int modifier) {

            setBorder(new LineBorder(Color.DARK_GRAY));

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

            im.put(KeyStroke.getKeyStroke(keyCode, modifier, false), "keyPressed");
            im.put(KeyStroke.getKeyStroke(keyCode, modifier, true), "keyReleased");

            am.put("keyPressed", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    setBackground(Color.RED);
                }
            });

            am.put("keyReleased", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    setBackground(UIManager.getColor("Panel.background"));
                }
            });

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(20, 20);
        }
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

等待一个过程完成,或者让用户按下一个键

来自分类Dev

按下一个键会创建循环,直到您按下另一个键

来自分类Dev

按下Enter键专注于表格内的下一个输入字段

来自分类Dev

如何确保仅按下一个键

来自分类Dev

如何使用nodejs按下一个键?

来自分类Dev

按下一个键后如何“进入”?

来自分类Dev

屏幕上的java打印arraylist元素,但等待用户按Enter键打印下一个

来自分类Dev

每当按下一个键时就转到另一个刺激

来自分类Dev

在下一个循环之前,在For循环中等待回调

来自分类Dev

在下一个循环之前,在For循环中等待回调

来自分类Dev

循环显示数组的下一个和上一个键

来自分类Dev

Javascript / Angularjs:在进入foreach循环的下一个迭代之前,等待诺言的实现

来自分类Dev

等待文件上传,然后再进行下一个循环迭代?

来自分类Dev

等待循环完成,然后再执行下一个功能

来自分类Dev

在 jQuery 中按下一个键后在表中添加一行

来自分类Dev

按下Enter键将焦点设置到下一个nextbox

来自分类Dev

按下Tab键时,不要将光标移至下一个按钮

来自分类Dev

按下Enter键时如何移动到下一个输入字段?

来自分类Dev

专注于下一个领域,在Vuejs中按Enter键

来自分类Dev

按Tab键缩进列表将移至下一个表格单元格

来自分类Dev

按下Enter键后如何进入下一个文本框?

来自分类Dev

将光标移至下一个文本字段,按Enter键

来自分类Dev

如何使Informix 4GL为我按下一个键?

来自分类Dev

在python中按下一个键时如何使计时器停止?

来自分类Dev

如何通过按下一个键在java中重新启动游戏?

来自分类Dev

如何在ruby中打破内循环和外循环的下一个?

来自分类Dev

跳到下一个循环(在while循环内进行XML解析)

来自分类Dev

编写一个简单的AutoHotkey脚本(在桌面上每X秒按下一个键)

来自分类Dev

如何在开始下一个循环之前使Javascript循环等待现有迭代结束?

Related 相关文章

  1. 1

    等待一个过程完成,或者让用户按下一个键

  2. 2

    按下一个键会创建循环,直到您按下另一个键

  3. 3

    按下Enter键专注于表格内的下一个输入字段

  4. 4

    如何确保仅按下一个键

  5. 5

    如何使用nodejs按下一个键?

  6. 6

    按下一个键后如何“进入”?

  7. 7

    屏幕上的java打印arraylist元素,但等待用户按Enter键打印下一个

  8. 8

    每当按下一个键时就转到另一个刺激

  9. 9

    在下一个循环之前,在For循环中等待回调

  10. 10

    在下一个循环之前,在For循环中等待回调

  11. 11

    循环显示数组的下一个和上一个键

  12. 12

    Javascript / Angularjs:在进入foreach循环的下一个迭代之前,等待诺言的实现

  13. 13

    等待文件上传,然后再进行下一个循环迭代?

  14. 14

    等待循环完成,然后再执行下一个功能

  15. 15

    在 jQuery 中按下一个键后在表中添加一行

  16. 16

    按下Enter键将焦点设置到下一个nextbox

  17. 17

    按下Tab键时,不要将光标移至下一个按钮

  18. 18

    按下Enter键时如何移动到下一个输入字段?

  19. 19

    专注于下一个领域,在Vuejs中按Enter键

  20. 20

    按Tab键缩进列表将移至下一个表格单元格

  21. 21

    按下Enter键后如何进入下一个文本框?

  22. 22

    将光标移至下一个文本字段,按Enter键

  23. 23

    如何使Informix 4GL为我按下一个键?

  24. 24

    在python中按下一个键时如何使计时器停止?

  25. 25

    如何通过按下一个键在java中重新启动游戏?

  26. 26

    如何在ruby中打破内循环和外循环的下一个?

  27. 27

    跳到下一个循环(在while循环内进行XML解析)

  28. 28

    编写一个简单的AutoHotkey脚本(在桌面上每X秒按下一个键)

  29. 29

    如何在开始下一个循环之前使Javascript循环等待现有迭代结束?

热门标签

归档