2

我在我的摇摆应用程序中添加KeyListener了一个TextField以尝试一些功能。目标是对输入的每个键做出反应TextField。用户应该只输入数字,但实际上,也可以输入字母字符。所以另外我必须在每次键入一个键后检查,如果整个东西是一个数字,如果是,用那个数字做一些事情,如果不是,告诉用户有错误而不退出程序。所以我想做这样的事情:

String enteredNumPlayers = "";

JTextField textfieldNumPlayers = new JTextField();
textfieldNumPlayers.setBounds(/*some values*/);
textfieldNumPlayers.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY));
textfieldNumPlayers.setHorizontalAlignment(JTextField.CENTER);
textfieldNumPlayers.addKeyListener(new KeyListener() {

    @Override
    public void keyTyped(KeyEvent e) {
        if(e.getKeyChar()!=/*Code of the back key*/){
            enteredNumPlayers += e.getKeyChar();
            System.out.println(e);
        }else{
            enteredNumPlayers = enteredNumPlayers.substring(0, s1.length()-1);
        }

        try{
            Integer.parseInt(enteredNumPlayers);
            // do something with that number
        }catch (NumberFormatException err){
            new ErrorDialog("Not a number"); // my own method to allude user
        }   
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub

    }
});

System.out.println(e)现在我想通过简单的方法查看后退键的具体代码keyTyped(...),但打印如下:

java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unbekannt keyCode: 0x0,keyChar=Rücktaste,keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0,extendedKeyCode=0x0] on (...)

为什么每个键值或代码 = 0 或未知?不应该是ascii值吗?使用“Rücktaste”也会很丑陋,因为在英语工作的计算机上这个值会有所不同,不是吗?那么我怎样才能干净地检查键入的键是否是后退键呢?

其他角色也会发生同样的事情,只是他们的 keyChar 是正确的。

4

2 回答 2

2

您正在寻找的是 aDocumentFilterDocumentListenera JFormattedTextField。这三个都是比使用键侦听器更好的解决方案,因为它还涵盖了拖放、复制粘贴或您能想到的将文本放入文本字​​段的任何其他机制。

于 2012-10-13T15:25:35.927 回答
2

我认为每次用户按下除整数以外的任何内容时都会显示错误消息有点烦人。检查此示例代码,它使用正则表达式来匹配输入,并且具有仅接受数字的优点,其他任何内容都不会插入到文本字段中(通过覆盖的insertString方法进行管理PlainDocument)。

于 2012-10-13T16:51:37.740 回答