jav*_*aba 5 java javafx javafx-2 javafx-8
如何在我的主类javafx中使用此代码.这样我就可以在javafx texfield中设置字符的最大长度.
class LimitedTextField extends TextField {
private final int limit;
public LimitedTextField(int limit) {
this.limit = limit;
}
@Override
public void replaceText(int start, int end, String text) {
super.replaceText(start, end, text);
verify();
}
@Override
public void replaceSelection(String text) {
super.replaceSelection(text);
verify();
}
private void verify() {
if (getText().length() > limit) {
setText(getText().substring(0, limit));
}
}
};
Run Code Online (Sandbox Code Playgroud)
我的java fx主类如下所示
public class TextFiled extends Application {
@Override
public void start(Stage primaryStage) {
final TextField t_fname = new TextField();
StackPane root = new StackPane();
root.getChildren().add(t_fname);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然OP的技术问题得到了正确回答(虽然未被接受),但基本问题的解决方案 - 如何限制/验证TextField中的输入(在其他帖子中得到回答)随着时间的推移而发生了变化.
使用java8u40,我们得到了一个新类TextFormatter:它的主要职责之一是在文本输入被调用到内容之前提供一个钩子.为了满足将输入限制到一定长度的要求(并且 - 只是为了好玩 - 显示带有错误消息的上下文菜单),我们会
代码段:
int len = 20;
TextField field = new TextField("max chars: " + len );
// here we reject any change which exceeds the length
UnaryOperator<Change> rejectChange = c -> {
// check if the change might effect the validating predicate
if (c.isContentChange()) {
// check if change is valid
if (c.getControlNewText().length() > len) {
// invalid change
// sugar: show a context menu with error message
final ContextMenu menu = new ContextMenu();
menu.getItems().add(new MenuItem("This field takes\n"+len+" characters only."));
menu.show(c.getControl(), Side.BOTTOM, 0, 0);
// return null to reject the change
return null;
}
}
// valid change: accept the change by returning it
return c;
};
field.setTextFormatter(new TextFormatter(rejectChange));
Run Code Online (Sandbox Code Playgroud)
在旁边:
在通知听众关于该状态的改变时修改发送者的状态通常是一个坏主意,并且可能容易导致意外和难以跟踪的副作用(我怀疑 - 虽然不知道 -其他答案中提到的撤消bug就是这样的副作用)
这是我的解决方案:
public static void addTextLimiter(final TextField tf, final int maxLength) {
tf.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) {
if (tf.getText().length() > maxLength) {
String s = tf.getText().substring(0, maxLength);
tf.setText(s);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
请参阅JavaFX 2.2 TextField maxlength和Prefer composition over继承?
您应该使用LimitedTextField而不是TextField。
替换此行:
final TextField t_fname = new TextField();
Run Code Online (Sandbox Code Playgroud)
与此:
final LimitedTextField t_fname = new LimitedTextField(maxLength);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8572 次 |
| 最近记录: |