JavaFX仅输入数字或字母,允许按TAB / ESCAPE / BACKSPACE等

时间:2016-12-12 19:14:38

标签: java javafx

Java正则表达式在我的程序中的TextField中运行。它将允许用户只输入数字[0-9],按键盘 TAB ESCAPE 。如何允许按键盘 BACKSPACE DELETE 键?

<?php

namespace Application;

use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;
use Zend\ServiceManager\Factory\InvokableFactory;

return [
    'router' => [
        'routes' => [
            'home' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'catalog' => [
                'type'    => Segment::class,
                'options' => [
                    'route'    => '/catalog[/:action]',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
        ],
    ],
    'controllers' => [
        'factories' => [
            Controller\IndexController::class => InvokableFactory::class,
        ],
    ],
    'view_manager' => [
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => [
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ],
        'template_path_stack' => [
            __DIR__ . '/../view',
        ],
    ],
];

void restrictNumbersOnly(KeyEvent keyEvent) { if (keyEvent.getCharacter().matches("[^\\e\t\r\\d+$]")) { /* SOME WARNING MSG */ keyEvent.consume(); } } 无效。我试着这样做:

keyEvent.getCode() == KeyCode.BACK_SPACE

3 个答案:

答案 0 :(得分:3)

我更改了问题标题,以便通过更好的搜索帮助其他人。

所以,我通过这样做解决了这个问题:

仅允许输入字母:

   textField.textProperty().addListener((observable, oldValue, newValue) -> {
        if (!newValue.matches("\\sa-zA-Z*")) {
            textField.setText(newValue.replaceAll("[^\\sa-zA-Z]", ""));
        }
    });

仅允许输入数字:

   textField.textProperty().addListener((observable, oldValue, newValue) -> {
        if (!newValue.matches("\\d*")) {
            textField.setText(newValue.replaceAll("[^\\d]", ""));
        }
    });

这些代码还允许用户按 ESCAPE DELETE BACKSPACE SPACE ...等...

答案 1 :(得分:0)

您无法在getCharacter事件中使用KEY_PRESSED。来自the javadoc:

  

对于按键和键释放事件,字符始终为CHAR_UNDEFINED

您可以改为使用getCodegetText,或者只使用KeyCode的方法:

void restrictNumbersOnly(KeyEvent keyEvent) {
    switch (keyEvent.getCode()) {
        case TAB:
        case BACK_SPACE:
        case DELETE:
            break;
        default:
            if (!keyEvent.getText().matches("\\d")) {
            // if (!keyEvent.getCode().isDigitKey()) {
                keyEvent.consume();
            }
    }
}

void restrictLettersOnly(KeyEvent keyEvent) {
    KeyCode code = keyEvent.getCode();
    switch (code) {
        case TAB:
        case BACK_SPACE:
        case DELETE:
            break;
        default:
            if (!code.isLetterKey()) {
                keyEvent.consume();
            }
    }
}

要限制输入,您需要在事件过滤器中使用其中一种方法:

textField.addEventFilter(KeyEvent.KEY_PRESSED, this::restrictNumbersOnly);

答案 2 :(得分:0)

这是我使用TextFormatter的方法:

UnaryOperator<TextFormatter.Change> doubleFilter = change -> {
    String input = change.getText();

    if ((input.matches("[\\d\\.]+")) || change.isDeleted()) {
        return change;
    }
    return null;
};


textField.setTextFormatter(new TextFormatter<String> (doubleFilter));

这将只允许数字,句点(。)和退格键/删除等。