所以我有一个具有布尔属性letters
和numbers
的类,用于允许用它写入哪种字符。我还想允许逗号和空格,所以我尝试了以下方法:
boolean check(char letter){
if(this.letters){
if((letter >= 'a' && letter <= 'z') || (letter >= 'A' && letter <= 'Z')){
return true;
}
}
if(this.numbers){
if(letter >= '0' && letter <= '9'){
return true;
}
}
if(letter == ' ' || letter == ','){
return true;
}
return false;
}
由于某种原因,即使按下的键是逗号或空格键,if语句if(letter == ' ' || letter == ',')
也不会运行。 为什么这不起作用?
答案 0 :(得分:1)
boolean check(char ch) {
return Character.isLetterOrDigit(ch) ||
Character.isSpaceChar(ch) ||
ch == ',';
}
如果您使用KeyEvent
,请确保将传入的字符转换为整数以检查其值
System.out.println(KeyEvent.VK_COMMA); // 44
System.out.println((int)','); // 44
System.out.println(KeyEvent.VK_SPACE); // 32
System.out.println((int)' '); // 32
我写了一个非常简单的Java Swing应用程序来验证每个按键。当用户键入数字或按下逗号键时,我必须检查是否按下了班次。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Foo extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea ara;
private JScrollPane scr;
private JLabel lbl;
public Foo() {
initComponents();
addChildren();
addListeners();
this.setFont(null);
this.setTitle("Character Validator");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setPreferredSize(new Dimension(300, 200));
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
private void initComponents() {
ara = new JTextArea(4, 60);
scr = new JScrollPane(ara);
lbl = new JLabel("Waiting for input...");
}
protected void addChildren() {
this.setLayout(new BorderLayout());
this.add(scr, BorderLayout.CENTER);
this.add(lbl, BorderLayout.SOUTH);
}
protected void addListeners() {
ara.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) { }
@Override
public void keyReleased(KeyEvent e) { }
@Override
public void keyPressed(KeyEvent e) {
if (isValidKey(e.getKeyChar(), e.isShiftDown()))
setMessage("Valid!", 0x007F00);
else
setMessage("Invalid!", 0x7F0000);
}
});
}
private void setMessage(String message, int color) {
lbl.setText(message);
lbl.setForeground(new Color(color));
}
protected boolean isValidKey(char keyChar, boolean isShiftDown) {
boolean validDigit = Character.isDigit(keyChar) && !isShiftDown;
boolean validLetter = Character.isLetter(keyChar);
boolean validSpace = keyChar == KeyEvent.VK_SPACE;
boolean validComma = keyChar == KeyEvent.VK_COMMA && !isShiftDown;
return validDigit || validLetter || validSpace || validComma;
}
public static void main(String[] args) {
new Foo();
}
}
答案 1 :(得分:0)
我已经尝试了代码的简化版本,它对我来说很好用。这是我可能想要尝试的完整草图:
boolean g_letters = true;
boolean g_numbers = true;
void setup() {}
void draw() {}
void keyPressed()
{
if(g_letters){
if((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z')){
println("Pressed: letter");
return;
}
}
if(g_numbers){
if(key >= '0' && key <= '9'){
println("Pressed: number");
return;
}
}
if(key == ' ' || key == ','){
println("Pressed: Comma / space");
return;
}
}
如果该草图适用于您,则问题出在代码中的其他位置。我怀疑问题是你在查询key
函数中的check()
全局变量(显然它不是内置的键处理程序之一)。这样做并不一定是不正确的,有时似乎有效。但是,如果您不小心,可能会在您的函数看到之前修改key
的其他代码或事件。
更好的方法是在您的密钥处理函数中使用key
值(例如keyPressed()
或您正在使用的任何值),并将其作为参数传递给您的{{1功能。这样,它不依赖于全局状态,这是(通常)面向对象编程中的不良实践。
尽管如此,我在此假设您的代码旨在将直接响应给用户输入。如果您实际上正在处理存储在字符串或其他内容中的字符,那么查询check()
全局变量是完全错误的,因为它仅用于用户输入。但是,修复方法类似 - 您只需将字符传递到key
函数而不是check()
值。
答案 2 :(得分:0)
看来你的功能取决于外部参数......我用它创建了一个简单的例子,它起作用了:
ClassyClass classy;
void setup() {
classy = new ClassyClass(true, true);
}
void draw() {
classy.draw();
}
void keyPressed() {
classy.check(key);
}
class ClassyClass {
boolean letters = true;
boolean numbers = true;
ClassyClass(boolean letters, boolean numbers) {
this.letters = letters;
this.numbers = numbers;
}
boolean check(char letter) {
if (this.letters) {
if ((letter >= 'a' && letter <= 'z') || (letter >= 'A' && letter <= 'Z')) {
println("its a letter! (" + letter + ")");
return true;
}
}
if (this.numbers) {
if (letter >= '0' && letter <= '9') {
println("its a number! (" + letter + ")");
return true;
}
}
if (letter == ' ' || letter == ',') {
println("its a space or a comma! (" + letter + ")");
return true;
}
return false;
}
void draw() {
ellipse(random(10,90),random(10,90),10,10);
}
}