Java 根据按下的键更改标签文本
在下面的程序中,我试图根据按下的键更改标签的文本,但我不知道如何操作。按下键时要执行的语句在TimerListener InnerClass的actionPerformed()方法中定义。但我不明白如何从那里获取标签Java 根据按下的键更改标签文本,java,swing,user-interface,key-bindings,Java,Swing,User Interface,Key Bindings,在下面的程序中,我试图根据按下的键更改标签的文本,但我不知道如何操作。按下键时要执行的语句在TimerListener InnerClass的actionPerformed()方法中定义。但我不明白如何从那里获取标签 package aircraftPackage; import java.awt.*; import java.awt.event.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedIma
package aircraftPackage;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.*;
public class Controller extends JPanel {
private static final long serialVersionUID = 1L;
public static final int STEP = 3;
private static final int TIMER_DELAY = STEP * 8;
private BufferedImage playerImage = null;
private Map<Direction, Boolean> directionMap = new HashMap<Direction, Boolean>();
enum Direction {
UP(KeyEvent.VK_UP, 0, -1), DOWN(KeyEvent.VK_DOWN, 0, 1),
LEFT(KeyEvent.VK_LEFT, -1, 0), RIGHT(KeyEvent.VK_RIGHT, 1, 0);
private int keyCode;
private int xDirection;
private int yDirection;
private Direction(int keyCode, int xDirection, int yDirection) {
this.keyCode = keyCode;
this.xDirection = xDirection;
this.yDirection = yDirection;
}
public int getKeyCode() {
return keyCode;
}
public int getXDirection() {
return xDirection;
}
public int getYDirection() {
return yDirection;
}
}
public Controller() {
for (Direction direction : Direction.values()) {
directionMap.put(direction, false);
}
setKeyBindings();
Timer timer = new Timer(TIMER_DELAY, new TimerListener());
timer.start();
}
private void setKeyBindings() {
InputMap inMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actMap = getActionMap();
for (final Direction direction : Direction.values()) {
KeyStroke pressed = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, false);
KeyStroke released = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, true);
inMap.put(pressed, direction.toString() + "pressed");
inMap.put(released, direction.toString() + "released");
actMap.put(direction.toString() + "pressed", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
directionMap.put(direction, true);
}
});
actMap.put(direction.toString() + "released", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
directionMap.put(direction, false);
}
});
}
}
private class TimerListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
boolean moved = false;
for (Direction direction : Direction.values()) {
if (directionMap.get(direction)) {
if (direction.keyCode == 37) {
System.out.println("go LEFT");
} else if (direction.getKeyCode() == 39) {
System.out.println("go RIGHT");
} else if (direction.getKeyCode() == 38) {
System.out.println("go UP");
}
else if (direction.getKeyCode()==40){
System.out.println("go DOWN");
}
}
}
}
}
public static void createAndShowUI() {
JFrame frame = new JFrame("MoveIcon");
JPanel panel = new JPanel();
JLabel jl = new JLabel();
jl.setText("testing....");
frame.add(jl);
frame.add(panel);
frame.getContentPane().add(new Controller());
new Controller();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
@SuppressWarnings("static-access")
public void run() {
createAndShowUI();
}
});
}
}
包装飞机包装;
导入java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.AffineTransform;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.net。*;
导入java.util.HashMap;
导入java.util.Map;
导入javax.imageio.imageio;
导入javax.swing.*;
公共类控制器扩展了JPanel{
私有静态最终长serialVersionUID=1L;
公共静态最终int步骤=3;
专用静态最终int定时器_延迟=步骤*8;
private BuffereImage playerImage=null;
private Map directionMap=新HashMap();
枚举方向{
向上(KeyEvent.VK_向上,0,-1),向下(KeyEvent.VK_向下,0,1),
左(KeyEvent.VK_LEFT,-1,0),右(KeyEvent.VK_RIGHT,1,0);
私钥密码;
私有int-xDirection;
私人内部指导;
专用方向(int键码、int xDirection、int yDirection){
this.keyCode=keyCode;
this.xDirection=xDirection;
this.yDirection=yDirection;
}
public int getKeyCode(){
返回键码;
}
public int getXDirection(){
返回方向;
}
public int getYDirection(){
返回方向;
}
}
公共控制员(){
对于(方向:Direction.values()){
directionMap.put(方向,false);
}
setKeyBindings();
定时器定时器=新定时器(定时器延迟,新定时器延迟();
timer.start();
}
私有void setKeyBindings(){
InputMap inMap=getInputMap(JComponent.WHEN_IN_FOCUSED_窗口);
ActionMap actMap=getActionMap();
对于(最终方向:Direction.values()){
按下击键=击键.getKeyStroke(direction.getKeyCode(),0,false);
击键释放=击键.getKeyStroke(direction.getKeyCode(),0,true);
inMap.put(按下,方向.toString()+“按下”);
inMap.put(已释放,direction.toString()+“已释放”);
actMap.put(direction.toString()+“按下”,新的AbstractAction(){
私有静态最终长serialVersionUID=1L;
@凌驾
已执行的公共无效操作(操作事件e){
directionMap.put(方向,true);
}
});
put(direction.toString()+“released”,新的AbstractAction()){
私有静态最终长serialVersionUID=1L;
@凌驾
已执行的公共无效操作(操作事件e){
directionMap.put(方向,false);
}
});
}
}
私有类TimerListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
布尔值=假;
对于(方向:Direction.values()){
if(directionMap.get(direction)){
如果(direction.keyCode==37){
System.out.println(“向左走”);
}else if(direction.getKeyCode()==39){
System.out.println(“向右走”);
}else if(direction.getKeyCode()==38){
System.out.println(“上升”);
}
else if(direction.getKeyCode()==40){
System.out.println(“向下”);
}
}
}
}
}
公共静态void createAndShowUI(){
JFrame=新JFrame(“移动图标”);
JPanel面板=新的JPanel();
JLabel jl=新的JLabel();
jl.setText(“测试…”);
帧。添加(jl);
框架。添加(面板);
frame.getContentPane().add(新控制器());
新控制器();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
invokeLater(new Runnable()){
@凌驾
@抑制警告(“静态访问”)
公开募捐{
createAndShowUI();
}
});
}
}
实际上,我想做的是,创建一个漂亮的表单,它将在Netbeans中包含各种标签(在那里更容易实现),并使用上面的代码只知道按下了哪个键,并相应地更改每个标签的值。
我试过了,但没用。
请帮我做这个。
谢谢
PS:您可以在一些问题或网站上找到上述代码的部分,因为我并不是自己写的。我以前没有任何键绑定/键侦听器等方面的经验。这只是我正在做的一个项目的一部分。我尝试删除您现在不需要的所有内容,并添加了一个
JLabel
,它显示如下方向:
这应该让你开始
import java.awt.event.*;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;
public class Controller extends JPanel {
private static final long serialVersionUID = 1L;
private static final int STEP = 3;
private static final int TIMER_DELAY = STEP * 8;
private Map<Direction, Boolean> directionMap = new HashMap<Direction, Boolean>();
private JLabel lblDirection = new JLabel();
enum Direction {
UP(KeyEvent.VK_UP), DOWN(KeyEvent.VK_DOWN),
LEFT(KeyEvent.VK_LEFT), RIGHT(KeyEvent.VK_RIGHT);
private int keyCode;
private Direction(int keyCode) {
this.keyCode = keyCode;
}
public int getKeyCode() {
return keyCode;
}
}
public Controller() {
add(lblDirection);
for (Direction direction : Direction.values()) {
directionMap.put(direction, false);
}
setKeyBindings();
Timer timer = new Timer(TIMER_DELAY, new TimerListener());
timer.start();
}
private void setKeyBindings() {
InputMap inMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actMap = getActionMap();
for (final Direction direction : Direction.values()) {
KeyStroke pressed = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, false);
KeyStroke released = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, true);
inMap.put(pressed, direction.toString() + "pressed");
inMap.put(released, direction.toString() + "released");
actMap.put(direction.toString() + "pressed", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
directionMap.put(direction, true);
}
});
actMap.put(direction.toString() + "released", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
directionMap.put(direction, false);
}
});
}
}
private class TimerListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
StringBuilder s = new StringBuilder("go ");
for (Direction direction : Direction.values()) {
if (directionMap.get(direction)) {
s.append(direction.name() + " ");
}
}
lblDirection.setText(s.toString());
}
}
public static void createAndShowUI() {
JFrame frame = new JFrame("KeyMapping");
frame.getContentPane().add(new Controller());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 80);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowUI();
}
});
}
}
导入java.awt.event.*;
导入java.util.HashMap;
导入java.util.Map;
导入javax.swing.*;
公共类控制器扩展了JPanel{
私有静态最终长serialVersionUID=1L;
私有静态最终int步骤=3;
专用静态最终int定时器_延迟=步骤*8;
private Map directionMap=新HashMap();
私有JLabel lblDirection=新JLabel();
枚举方向{
向上(KeyEvent.VK_向上),向下(KeyEvent.VK_向下),
左(KeyEvent.VK_左),右(KeyEvent.VK_右);
私钥密码;
私人直接