Java KeyListener可以工作,但不能';T
我对keylistener还不熟悉,但最近我制作了一个小程序,它将在下面介绍,它使用keylistener使a、W、S、D键移动一个正方形。嗯,我用dropbox在这台笔记本电脑上获取程序,现在它不工作了。它在键盘上工作,但在笔记本电脑键盘上却不工作,这对我来说似乎很奇怪。你知道为什么吗?以下是代码,以及一部分:Java KeyListener可以工作,但不能';T,java,swing,keyboard,keylistener,japplet,Java,Swing,Keyboard,Keylistener,Japplet,我对keylistener还不熟悉,但最近我制作了一个小程序,它将在下面介绍,它使用keylistener使a、W、S、D键移动一个正方形。嗯,我用dropbox在这台笔记本电脑上获取程序,现在它不工作了。它在键盘上工作,但在笔记本电脑键盘上却不工作,这对我来说似乎很奇怪。你知道为什么吗?以下是代码,以及一部分: public class Game extends JApplet implements KeyListener { public boolean isMoving =
public class Game extends JApplet implements KeyListener
{
public boolean isMoving = false;
int test = 0;
Rect r = new Rect();
public void keyPressed(KeyEvent e){}
public void keyReleased(KeyEvent e){} // ignore
public void keyTyped(KeyEvent e)
{
char keyChar = e.getKeyChar();
if (keyChar == KeyEvent.VK_S)
{
r.yVelocity -= 1;
}
if (keyChar == KeyEvent.VK_W)
{
r.yVelocity+=1;
}
if (keyChar == KeyEvent.VK_A)
{
r.xVelocity -=1;
}
if (keyChar == KeyEvent.VK_D)
{
r.xVelocity +=1;
}
}
KeyListener
有焦点问题。也就是说,它只会在可聚焦且具有焦点时响应关键事件
简单的解决方案是使注册了KeyListener
的组件可调焦,并使用requestFocusInWindow
,但这并不意味着该组件将接收键盘调焦
更好的解决方案是使用API,它允许您配置引发关键事件所需的焦点级别
使用密钥绑定示例/测试更新
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
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;
public class TestKeyBindings {
public static void main(String[] args) {
new TestKeyBindings();
}
public TestKeyBindings() {
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 KeyPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class KeyPane extends JPanel {
private Triangle up;
private Triangle down;
private Triangle left;
private Triangle right;
private Set<String> activeKeys;
public KeyPane() {
activeKeys = new HashSet<>(4);
up = new Triangle(20);
down = new Triangle(20);
left = new Triangle(20);
right = new Triangle(20);
AffineTransform at = AffineTransform.getRotateInstance(Math.toRadians(-90), 10, 10);
left.transform(at);
at = AffineTransform.getRotateInstance(Math.toRadians(180), 10, 10);
down.transform(at);
at = AffineTransform.getRotateInstance(Math.toRadians(-270), 10, 10);
right.transform(at);
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "upPressed");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "downPressed");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "leftPressed");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "rightPressed");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, true), "upReleased");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "downReleased");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true), "leftReleased");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), "rightReleased");
ActionMap am = getActionMap();
am.put("upPressed", new DirectionAction("up", true));
am.put("downPressed", new DirectionAction("down", true));
am.put("leftPressed", new DirectionAction("left", true));
am.put("rightPressed", new DirectionAction("right", true));
am.put("upReleased", new DirectionAction("up", false));
am.put("downReleased", new DirectionAction("down", false));
am.put("leftReleased", new DirectionAction("left", false));
am.put("rightReleased", new DirectionAction("right", false));
}
public void addKey(String name) {
activeKeys.add(name);
repaint();
}
public void removeKey(String name) {
activeKeys.remove(name);
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int x = (getWidth() - (up.getBounds().width * 3)) / 2;
int y = (getHeight() - 10) / 2;
AffineTransform at = AffineTransform.getTranslateInstance(x, y);
if (activeKeys.contains("left")) {
g2d.fill(left.createTransformedShape(at));
} else {
g2d.draw(left.createTransformedShape(at));
}
at = AffineTransform.getTranslateInstance(x + 40, y);
if (activeKeys.contains("right")) {
g2d.fill(right.createTransformedShape(at));
} else {
g2d.draw(right.createTransformedShape(at));
}
at = AffineTransform.getTranslateInstance(x + 20, y - 20);
if (activeKeys.contains("up")) {
g2d.fill(up.createTransformedShape(at));
} else {
g2d.draw(up.createTransformedShape(at));
}
at = AffineTransform.getTranslateInstance(x + 20, y + 20);
if (activeKeys.contains("down")) {
g2d.fill(down.createTransformedShape(at));
} else {
g2d.draw(down.createTransformedShape(at));
}
g2d.dispose();
}
public class DirectionAction extends AbstractAction {
private String name;
private boolean pressed;
public DirectionAction(String name, boolean pressed) {
this.name = name;
this.pressed = pressed;
}
@Override
public void actionPerformed(ActionEvent e) {
if (pressed) {
addKey(name);
} else {
removeKey(name);
}
}
}
}
public class Triangle extends Path2D.Double {
public Triangle(int size) {
moveTo(size / 2, 0);
lineTo(size, size);
lineTo(0, size);
closePath();
}
}
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.ActionEvent;
导入java.awt.event.KeyEvent;
导入java.awt.geom.AffineTransform;
导入java.awt.geom.Path2D;
导入java.util.ArrayList;
导入java.util.HashSet;
导入java.util.Set;
导入javax.swing.AbstractAction;
导入javax.swing.ActionMap;
导入javax.swing.InputMap;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.KeyStroke;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类TestKeyBindings{
公共静态void main(字符串[]args){
新的TestKeyBindings();
}
公共TestKeyBindings(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(newkeypane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类键窗格扩展了JPanel{
私人三角上升;
私人三角下降;
私人三角左;
私人三角权;
私钥;
公钥窗格(){
activeKeys=新哈希集(4);
向上=新三角形(20);
向下=新三角形(20);
左=新三角形(20);
右=新三角形(20);
仿射变换at=AffineTransform.getRotateInstance(数学toRadians(-90),10,10);
左。变换(at);
at=AffineTransform.getRotateInstance(数学toRadians(180),10,10);
向下转换(at);
at=AffineTransform.getRotateInstance(数学toRadians(-270),10,10);
对。转换(at);
InputMap im=getInputMap(在聚焦窗口中时);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,0,false),“upPressed”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0,false),“downPressed”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0,false),“leftPressed”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0,false),“rightspressed”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,0,true),“upReleased”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0,true),“downleased”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0,true),“leftReleased”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0,true),“righreleased”);
ActionMap am=getActionMap();
am.put(“向上”,新方向动作(“向上”,正确));
am.put(“向下压”,新方向动作(“向下”,正确));
am.put(“左压”,新方向动作(“左”,真));
am.put(“右压”,新方向动作(“右”,真));
am.put(“上调”,新方向动作(“上调”,虚假));
am.put(“向下释放”,新方向动作(“向下”,错误));
am.put(“leftReleased”,新方向动作(“left”,false));
am.put(右释放),新指令动作(右,假);
}
public void addKey(字符串名称){
activeKeys.add(名称);
重新油漆();
}
public void removeKey(字符串名称){
activeKeys.remove(名称);
重新油漆();
}
@凌驾
公共维度getPreferredSize(){
返回新维度(200200);
}
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g.create();
intx=(getWidth()-(up.getBounds().width*3))/2;
int y=(getHeight()-10)/2;
AffineTransform at=AffineTransform.getTranslateInstance(x,y);
if(activeKeys.contains(“左”)){
g2d.fill(左.createTransformedShape(at));
}否则{
g2d.draw(左.createTransformedShape(at));
}
at=AffineTransform.getTranslateInstance(x+40,y);
if(activeKeys.contains(“right”)){
g2d.fill(right.createTransformedShape(at));
}否则{
g2d.draw(right.createTransformedShape(at));
}
at=AffineTransform.getTranslateInstance(x+20,y-20);
if(activeKeys.contains(“up”)){
g2d.fill(up.createTransformedShape(at));
}否则{
g2d.绘制(up.createTr)