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
答案 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
。
您可以改为使用getCode
和getText
,或者只使用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));
这将只允许数字,句点(。)和退格键/删除等。