在 Java 中,继续从键盘获取键盘代码而不是字符输入



当我在键盘上输入一个键时,我一直遇到问题,它一直返回键盘代码,例如当我按 1 时,它返回的值为49我已经尝试更改数据类型以使用char并且问题仍然存在。它似乎只在我的一种方法中输出键盘代码,但不适用于我拥有的addKeyListener方法。当我打印出SETSIZE变量时,它会返回正确的输入,但是在我的方法中称为assignMovenum参数不断输出键盘代码,我不确定为什么。将不胜感激。

面板单元类

private GamePanel panel;
private int row;
private int col;
public static final char SETSIZE = 5;
addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
char SETSIZE = e.getKeyChar();
panel.assignMove(row, col, SETSIZE);
}
});

游戏面板类

void assignMove(int row, int col, int num)
{
System.out.print(num);   
if ((row<1) || (row>Futoshiki.SETSIZE)) {
JOptionPane.showMessageDialog(null, 
"invalid row (" + row + ")", 
"Futoshiki",   
JOptionPane.DEFAULT_OPTION);  
throw new FutoshikiException("invalid row (" + row + ")");
}

if ((col<1) || (col>Futoshiki.SETSIZE)) {
JOptionPane.showMessageDialog(null, 
"invalid column (" + col + ")", 
"Futoshiki",   
JOptionPane.DEFAULT_OPTION); 
throw new FutoshikiException("invalid column (" + col + ")");
}

if (game.isAssigned(row, col)) {
JOptionPane.showMessageDialog(null, 
"the cell at (" + row + "," + col + ") is assigned (" + game.getNum(row,col) + ")", 
"Futoshiki",   
JOptionPane.DEFAULT_OPTION);  
throw new FutoshikiException("the cell at (" + row + "," + col + ") is assigned (" + game.getNum(row,col) + ")");
}

if ((num<1) || (num>Futoshiki.SETSIZE)) {
JOptionPane.showMessageDialog(null, 
"invalid value " + num, 
"Futoshiki",   
JOptionPane.DEFAULT_OPTION);   
throw new FutoshikiException("invalid value " + num);
}

if (!game.isValidAssign(row, col, num)) {
JOptionPane.showMessageDialog(null, 
"invalid value assignment " + row + " " + col + " " + num, 
"Futoshiki",   
JOptionPane.DEFAULT_OPTION);
throw new FutoshikiException("invalid value assignment " + row + " " + col + " " + num);
}

Assign userMove = new Assign(row, col, num);
System.out.print("row " + row + " " + "col "+ col + " " + "num " + num);
game.assign(userMove);
}
char

是Java中的原始类型。它是一个 16 位无符号整数,表示 Unicode 代码点。它不包含键盘上显示的值。

您可以使用类java.lang.Character的方法获取"键盘"值。

addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
char ch = e.getKeyChar();
if (Character.isDigit(ch)) {
panel.assignMove(row, col, Character.getNumericValue(ch));
}
}
});

或者,您可以简单地检查该值。

addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
char ch = e.getKeyChar();
int val = (int) ch;
if (val >= 48  &&  val <= 57) {
panel.assignMove(row, col, val - 48);
}
}
});

assignMove方法中使用char num而不是int num。因为您的num参数是一个int,所以传递的char值将类型转换为int这将是 ASCII 代码。

样本:

void assignMove(int row, int col, char num)

最新更新