gpt4 book ai didi

java - 这个 Actor 好吗?

转载 作者:行者123 更新时间:2023-11-29 10:09:57 26 4
gpt4 key购买 nike

我有一个 EventHandler,我将其设置为 event filter在 TextFields 上。当我编写类时,我通过调用 getSource() 获得源 TextField事件并将其转换为 TextField。

事件处理程序的代码:

public class NumberFilter implements EventHandler<KeyEvent> {

public final int maxLength;
public NumberFilter(int maxLength) {
this.maxLength = maxLength;
}

@Override
public void handle(KeyEvent event) {
TextField textField = (TextField) event.getSource(); //<-- is this cast okay?

//consume event if there is too much text or the input isn't a number.
if (textField.getText().length() >= maxLength || !event.getCharacter().matches("[0-9]")) {
event.consume();
}
}
}

按照标准的 Java 惯例,这个转换是否合适?我如何编写该类才能使其只能用作 TextField 的事件过滤器?

最佳答案

Andy Turner 的回答提供了一种强大的通用方法,允许将事件处理程序仅添加到一种类型的节点。但是,对于否决对 TextField(或其他文本输入控件)中文本的更改的特定情况,使用键事件处理程序的方法不是一个好方法,原因如下:

  1. 用户可以使用鼠标调出上下文菜单并在其中粘贴文本。这根本不涉及任何按键操作,因此不会调用您的处理程序。
  2. 您无法控制文本字段内部使用的按键事件类型。您是否使用 KEY_PRESSEDKEY_RELEASEDKEY_TYPED 事件注册此过滤器?您确定文本字段内部使用的事件从一个 JavaFX 版本到下一个版本都保持不变吗?
  3. 您可能会无意中否决键盘快捷键,例如 Ctrl-C(用于复制)或 Ctrl-V(用于粘贴)等。 (如果你不否决“粘贴”的快捷方式,你就允许用户粘贴无效文本的另一个漏洞......)。同样,JavaFX 的 future 版本可能会引入额外的快捷方式,这几乎不可能证明您的功能。

为了完整起见,此特定用例的首选方法如下:

使用 TextFormatter ,这是支持的机制,用于否决或修改文本输入控件的文本输入(以及提供格式化或解析控件中文本的机制)。您可以通过在独立类中实现过滤器来使其可重用:

public class NumberFilter implements UnaryOperator<TextFormatter.Change> {

private final Pattern pattern ;

public NumberFilter(int maxLength) {
pattern = Pattern.compile("[0-9]{0,"+maxLength+"}");
}

@Override
public TextFormatter.Change apply(TextFormatter.Change c) {
String newText = c.getControlNewText() ;
if (pattern.matcher(newText).matches()) {
return c ;
} else {
return null ;
}
}
}

现在你可以做

TextField textField = new TextField();
textField.setTextFormatter(new TextFormatter<String>(new NumberFilter(5)));

关于java - 这个 Actor 好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43879693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com