首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX-8:限制文本字段中的字符数

JavaFX-8:限制文本字段中的字符数
EN

Stack Overflow用户
提问于 2016-01-02 15:02:58
回答 1查看 3.1K关注 0票数 2

我试图限制可以插入JavaFX-8 TextField中的字符数:当达到限制时,调用endLineReached()方法。我想根据textfield的大小(GUI上可见的部分)来设置字符的最大数量。所以我用的代码是

代码语言:javascript
复制
textfield.textProperty().addListener((ov, oldValue, newValue) -> {
            onEndLine(textfield.getText(), textfield.getPrefColumnCount());
        });


public void onEndLine(String text, int prefColumnCount) {
    if (text.length() > prefColumnCount) {
        endLineReached();
    }
}

问题是textfield.getPrefColumnCount()不能正常工作。此外,我无法以编程方式设置prefColumnCount值,因为textfield宽度可能会在每次程序重新启动时(而不是在执行期间)发生变化。textfield是JavaFX HBox的子字段。

EN

回答 1

Stack Overflow用户

发布于 2016-01-02 16:36:54

如果您只想根据文本字段的视觉宽度来限制文本的长度,这有点棘手,因为它取决于许多因素(字体、文本字段的宽度、应用于文本字段的填充,如果是可变宽度字体,则是输入的实际文本,等等)。

注意,这似乎是一件奇怪的事情(imo),因为如果用户碰巧使用窄字符,它将能够输入相对较长的文本,而如果它恰好使用宽字符,则可以输入相对较短的文本(在下面的示例中,我可以输入26“l,但只有8 "m"s)。实际上,允许用户输入的文本应该基于逻辑考虑(即业务规则),而不是可视规则。但也许你有一些不寻常的用例。

您可以在文本字段上使用文本格式化程序来否决文本的添加。若要检查宽度,请使用新文本创建一个新的Text对象,将字体设置为与文本字段相同的字体,然后检查其宽度。您还需要说明文本字段中的填充。注意,这有点脆弱,因为您并不真正了解文本字段布局的实现,但这似乎还可以,至少在我的JDK版本中是这样的。

代码语言:javascript
复制
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextInputControl;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class TextFieldNoScroll extends Application {

    @Override
    public void start(Stage primaryStage) {
        TextField textField = new TextField();
        textField.setTextFormatter(new TextFormatter<String>(change -> {

            if (change.isAdded()) {
                Insets textFieldInsets = change.getControl().getPadding();              
                double horizPadding = textFieldInsets.getLeft() + textFieldInsets.getRight() ;

                Text newText = new Text(change.getControlNewText());
                newText.setFont(((TextInputControl)change.getControl()).getFont());
                double newTextWidth = newText.getBoundsInLocal().getWidth();
                if (newTextWidth + horizPadding > change.getControl().getWidth()) {
                    return null ;
                }
            }

            return change ;
        }));

        VBox root = new VBox(textField);
        root.setAlignment(Pos.CENTER);
        Scene scene = new Scene(root, 120, 120);
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34567300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档