如何在我的主类的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));
}
}
};
我的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);
}
}
这是我的解决方案:
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);
}
}
});
}
见的JavaFX 2.2文本字段最大长度和身高组成了继承?
虽然OP的技术问题回答正确 (虽然不接受),解决基本问题-如何限制/在这是在其他职位回答了文本字段验证输入-随时间发生变化。
随着java8u40我们得到了一类新的TextFormatter:它的主要职责之一是提供一个勾成文本输入的任何变化,然后才会慢慢comitted的内容。 为了满足限制输入一定长度的要求(和 - 只是为了好玩 - 显示一个错误消息的上下文菜单),我们会
- 执行该分析的所有更改的UnaryOperator
- 拒绝那些,这将导致成较长的文本(和显示消息)
- 接受所有其他变化
- 实例化的TextFormatter与运营商
- 用的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));
在旁边:
修改发送方的状态,而它通知有关国家的改变它的听众通常是一个坏主意,可能很容易导致意外和难以跟踪的副作用(我怀疑-虽然不知道-即在其他的答案提到撤消错误是这样的副作用)
你应该用你LimitedTextField
而不是TextField
。
替换此行:
final TextField t_fname = new TextField();
这一个:
final LimitedTextField t_fname = new LimitedTextField(maxLength);
这是非常相似的LimitedTextField,但我觉得它更整洁,因为验证是TextInput之前完成(而不是之后)。 另外随着蜂鸣提示和用户得到一些反馈,该输入是故意的限制。 当现场失去焦点的提示关闭。
import java.awt.Toolkit;
import javafx.scene.control.TextField;
public class DataTextField extends TextField
{
int length;
int compare;
public DatenTextField(int length)
{
super();
this.length = length;
}
public void replaceText(int start, int end, String text)
{
compare = getText().length() - (end - start) + text.length();
if( compare <= length || start != end)
{
super.replaceText( start, end, text );
}
else
{
Toolkit.getDefaultToolkit().beep();
show();
}
}
public void replaceSelection(String text)
{
compare = getText().length() + text.length();
if( compare <= length )
{
super.replaceSelection( text );
}
else
{
Toolkit.getDefaultToolkit().beep();
show();
}
}
private void show()
{
final ContextMenu menu = new ContextMenu();
menu.getItems().add(new MenuItem("This field takes\n"+length+" characters only."));
menu.show(this, Side.BOTTOM, 0, 0);
}
}
我的解决办法,以限制TextField
与字符的最大长度:
final int maxLength = 20;
textField.setOnKeyTyped(t -> {
if (textField.getText().length() > maxLength) {
int pos = textField.getCaretPosition();
textField.setText(textField.getText(0, maxLength));
textField.positionCaret(pos); //To reposition caret since setText sets it at the beginning by default
}
});