0

所以我有一个具有布尔属性的类,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(letter == ' ' || letter == ',')即使按下的键是逗号或空格键,if 语句也不会运行。为什么这不起作用?

4

3 回答 3

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 应用程序来验证每个按键。当用户键入数字或按下逗号键时,我必须检查是否按住了 shift。

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();
    }
}
于 2013-11-06T03:49:12.163 回答
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);
  }
}
于 2013-11-06T10:26:50.650 回答
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()或您正在使用的任何内容)中获取值,并将其作为参数传递给您的check()函数。这样它就不依赖于全局状态,这在面向对象编程中(通常)是不好的做法。

综上所述,我在这里假设您的代码旨在直接响应用户输入。如果您实际上正在处理存储在字符串或其他内容中的字符,那么查询key全局变量是完全错误的,因为它仅用于用户输入。但是,修复将是相似的——您只需将字符check()而不是key值传递给您的函数。

于 2013-11-06T10:23:00.203 回答