当前位置: 首页 > 知识库问答 >
问题:

JavaFX TextFormatter问题,文本为空

毕嘉
2023-03-14

我遇到JavaFX文本格式化程序的问题。我想知道是我做错了什么,还是JavaJDK有错误。

以下是显示问题的代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class TestApp extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        TextField field = new TextField("test0");
        field.setTextFormatter(new TestTextFormatter());
        Button btn = new Button();
        btn.setText("Test");
        btn.setOnAction(e -> {
            field.setText(null);
            field.setText("test");
        });
        BorderPane root = new BorderPane();
        root.setTop(btn);
        root.setCenter(field);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
    class TestTextFormatter extends TextFormatter<String> {
        public TestTextFormatter() {
            super(c -> {
                System.out.println("newControlText=" + c.getControlNewText());
                return c;
            });
        }
    }
}

单击按钮几次。第一次按预期工作输出是:newControlText=test0 newControlText=newControlText=test

第二次和每一次尝试都会导致异常:

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: The start must be <= the end
    at javafx.scene.control.TextInputControl.getText(TextInputControl.java:446)
    at javafx.scene.control.TextInputControl$TextInputControlFromatterAccessor.getText(TextInputControl.java:1609)
    at javafx.scene.control.TextFormatter$Change.getControlNewText(TextFormatter.java:453)
    at TestApp$TestTextFormatter.lambda$0(TestApp.java:34)
    at javafx.scene.control.TextInputControl.filterAndSet(TextInputControl.java:1165)
    at javafx.scene.control.TextInputControl.access$900(TextInputControl.java:79)
    at javafx.scene.control.TextInputControl$TextProperty.doSet(TextInputControl.java:1410)
    at javafx.scene.control.TextInputControl$TextProperty.set(TextInputControl.java:1323)
    at javafx.scene.control.TextInputControl.setText(TextInputControl.java:349)
    at TestApp.lambda$0(TestApp.java:21)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
...

您能帮助我了解问题在哪里(我的代码或JDK)?

共有2个答案

曹浩波
2023-03-14

它是一个过滤器,在应用方法时引发异常。

如果您的代码允许设置null值,那么您应该按照以下方式重写TestTextFormatter类

class TestTextFormatter extends TextFormatter<String> {
    public TestTextFormatter() {
        super(c -> {
            if ( ((TextField)c.getControl()).getText() == null ) {
                return c;
            }
            System.out.println("newControlText=" + c.getControlNewText());
            return c;
        });
    }
}
湛功
2023-03-14

请看这个答案https://stackoverflow.com/a/32893573/814304

您正在尝试更改事件中的文本,这正是您不应该做的。

 类似资料:
  • 我已经建立了一个网站,从摄像头读取条形码。我可以捕获条形码文本并将其打印到P元素,如下所示。但我想在文本框中看到它。这可能吗?在文本框的值处看不到条形码。

  • 问题内容: 我有一组Books对象, Book 类定义如下: 当 标题 是书,例如标题: JavaScript来假人 。 和 taglist 是我们示例的标签列表: Javascript,jquery,“ web dev”,.. 正如我所说,有一本书谈论不同的事物:IT,生物学,历史……每本书都有一个标题和一组描述它的标签。 我必须按主题自动将这些书分类为单独的集合,例如: 书: 傻瓜Java 假

  • 主要内容:案例1:属性有特殊字符的文件,案例2:有特殊字符的属性文件(编码),Struts2..哪里有问题?,解决办法,回答之前的问题,参考一个 Struts2 的国际化定位的问题,用来显示中国汉字... 案例1:属性有特殊字符的文件 属性文件存储用户名,密码信息,并以中文字符提交。此属性文件以UTF-8格式创建的,但内容不使用 native2ascii 编码。 让我们试着通过一些UI标签,来显示中国汉字。查看页面声明为UTF-8格式的HTML元标记来显示。 结果 令人惊奇的是,以下三个UI标签

  • 我使用Netbeans创建了一个GUI,它要求用户在文本字段和文本区域中输入内容。当我试图在其他类中使用它时,当我对其使用getText方法时,在文本字段中输入的文本不会出现。取而代之的是,在使用Netbeans中的编辑文本选项指定的文本字段中出现的文本,每当使用getText方法时都会出现。问题是否与某种排序或顺序有关?因为我相信GUI中的文本是在用户实际输入之前被引用的。

  • 我有下面的代码来刮一个页面,https://www.hotukdeals.com 由于某种原因,这种方法起作用,在循环中刮取交易的价格一定的次数,然后停止工作。 程序输出: 从输出中可以看到,在前四行之后,属性为空,但元素中有文本。 有人知道这事吗?有什么想法或解决办法吗?

  • 我正在使用iText7复制pdf页面,并对这些页面进行编号。所以我不需要手动给它们编号。但是生成的pdf文件中的数字有问题。下面是它的样子: 我想了好几个小时,还是想不出来。 我的代码: