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

让循环等待某种动作是一种反直观(IMHO).

一般来说,如果可以,应该避免使用KeyListeners.他们有重点关注的问题. key bindings API具有克服此限制的方法.

它允许您针对Action注册一个KeyStroke,并允许您的程序坐下来等到发生某种事情为止.

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

}

}

}

java for循环 等待_java-等待在循环内按下键相关推荐

  1. java 循环写法_java的for循环的几种写法

    J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象.本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类 ...

  2. java for怎么跳出_java跳出for循环的方法

    java跳出for循环的方法 发布时间:2020-06-26 15:56:42 来源:亿速云 阅读:193 作者:Leah 这篇文章将为大家详细讲解有关java跳出for循环的方法,文章内容质量较高, ...

  3. java双重for循环流程图_java 流程执行 循环 foreach循环

    一. if分支 1. 结构  if  else if   else 2.执行原则 if  if  if 结构  会一直去执行()里的判断语句 if else if  else if 结构  只要一条( ...

  4. java双重for循环流程图_Java的for循环

    Java有好几种循环语句. for循环是Java的循环之一. for循环在java中用于重复执行一些语句,直到条件返回false. for循环有以下三个部分. 初始化 循环条件 自增或自减 for循环 ...

  5. java中的循环结构_Java中的循环结构进阶

    循环结构进阶 学习本章用到的单词 triangle:三角形 circle:圆形 diamond:钻石 password:密码 row:行.排列 二重循环结构 简单的说:二重循环就是一个循环体内又包含另 ...

  6. java 对象向上转型_JAVA对象向上转型和向下转型

    今天做了一个测试的题目,发现自己还是很多问题没有静下心来做.很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了.所以这个要自己应以为鉴! 对象的转型问题其实并不复杂,我们记住一句话 ...

  7. java二重循环计数_java的二重循环代码样例

    1.计算三个班的平均分 import java.util.Scanner; public class AvgScore{ public static void main (Sting[] args){ ...

  8. java合并sheet行_java poi Excel循环合并行

    //Java poi 实现循环合并行,还是第一次遇到这种问题 //在网上查了很多资料,都不是自己想要的 //以下为自己研究后,写的一点东西,给大家分享,希望对大家能有思路上的启发,也希望大家能提出宝贵 ...

  9. java for循环 写法_java中for循环的6种写法

    packageForLoop;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;/*** java中for ...

最新文章

  1. PCL:点云配准1、基础知识:平面3自由度、旋转矩阵精讲
  2. Science:基于微生物条形码系统的高分辨率物源追踪技术
  3. 018_Spring+ActiveMQ(消息中间件)
  4. Android中使用SeekBar拖动条实现改变图片透明度
  5. php 不支持无符号整数,是否可以使用大型无符号int64而不会在PHP中失去精度?
  6. Charlse 抓包
  7. 查看Ubuntu中的ip地址
  8. 2016年ICT行业前瞻:竞合生态,牵着手 一起走
  9. 04-07递归解法问题
  10. (轉載)HDMI之EDID字段解析
  11. FISCO BCOS v3.x 多群组区块链Pro版本搭建说明(ubuntu)
  12. 单片机c语言有没有跳转指令,51单片机跳转指令
  13. 代码整洁之道 1-3阅读笔记
  14. 2015 数学建模 国赛(高教杯)-B题 “互联网+”时代的出租车资源配置
  15. 如何彻底卸载MySQL5.7
  16. 解决:sql server无法在C盘下创建database/操作系统错误5(拒绝访问)
  17. 回忆杀,pythonQ版泡泡堂
  18. 电阻、电容、电感的高频等效电路详细分析
  19. [JavaScript]根据中文(拼音)英文进行分类
  20. HEIC图片转换软件

热门文章

  1. 全球首发!计算机视觉Polygon Mesh Processing总结8——Remeshing Global Structure和Correspondences
  2. 卷积神经网络——第一周 卷积神经网络基础——第三部分
  3. ModuleNotFoundError: No module named 'sklearn.grid_search'报错
  4. 综述!信息检索中的花式预训练
  5. 时钟服务器地址_时钟同步 Chrony 教程
  6. 对最大熵模型为什么要最大化熵的一点理解
  7. Vue源码学习(三)——数据双向绑定
  8. el-tree 拖拽互换位置_那些我们与UI交互的动作(三·拖拽)
  9. 多线程 转账_Java多线程编程基础三(原子性,可见性和有序性)
  10. [Ext JS ]3.4 数字输入框 numberfield