import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Game implements KeyListener {
static int imgx = 20;
static int imgy = 20;
JFrame fen = new JFrame();
JPanel pan = new JPanel();
public void display() {
fen.add(pan);
fen.addKeyListener(this);
JLabel img = new JLabel();
img.setText("zzz");
img.setBounds(imgx, imgy, 20, 20);
pan.add(img);
fen.setVisible(true);
fen.setSize(480, 272);
}
public static void main(String[] args) {
Game disp = new Game();
disp.display();
}
@Override
public void keyTyped(KeyEvent e) {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
if(e.getKeyCode() == KeyEvent.VK_LEFT) {
System.out.println("test");
imgx -= 10;
fen.revalidate();
}
}
}
为什么,当我输入左边时,标签本身不会移动?请帮我... 我有一个关键的JFrame监听器,以及为什么当我在键盘上键入左键时它没有进入我的keyTyped事件?
答案 0 :(得分:3)
关于keyListener。
在e.getkeyCode()
的帮助下:
返回与此事件中的键关联的整数keyCode。 返回:键盘上实际键的整数代码。 (对于 KEY_TYPED事件,keyCode是VK_UNDEFINED。)
将您的代码放在keyPressed
或keyReleased
方法中,您可以按原样使用代码。
值得一提的是这个答案中所说的: https://stackoverflow.com/a/7071810/2581593 KeyTyped事件仅识别可打印字符键,因此无论如何它都不能用于VK_LEFT。
关于移动标签。
setBounds()
只有在您想要放置带边界的组件的布局为null
时才有意义。
再次引用java文档:
每个JPanel对象都被初始化为使用FlowLayout,除非你 在创建JPanel时指定不同。
在您的情况下,为了能够将标签img
绘制为给定的坐标,您需要添加:
pan.setLayout(null);