【问题标题】:JavaFX TextArea with listener gives: “java.lang.IllegalArgumentException: The start must be <= the end”带有侦听器的 JavaFX TextArea 给出:“java.lang.IllegalArgumentException:开始必须是 <= 结束”
【发布时间】:2015-07-20 21:31:28
【问题描述】:

尝试更改文本属性侦听器中的文本时出现异常。例外是完全相同的是this question。我使用TextArea而不是TextField,但我认为错误的来源是相同的。它在“TextInputControl.java”中。这似乎是 Java 8 的错误。

@FXML
private TextArea ta;
ta.setText("12-");  // pre-set text 
ta.textProperty().addListener((observable, oldValue, newValue) -> {
    ta.setText("1"); // changed text
});

这会导致我的机器出现异常。我在 Win 7 64 位上有 JDK 1.8.0_51。但是,如果我切换回 JDK 1.8.0_25,这不会导致异常。

我厌倦了一系列“预设文本”和“更改的文本”组合,我发现,通常,如果“更改的文本”的长度很短时更容易导致异常,那么“预设置文本”。

是否有解决此问题的方法?还是我在某个地方犯了错误?

感谢您的帮助。

编辑: 以下代码将重现该问题。我用jre 8u60测试过,问题依旧。

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            TextArea ta =  new TextArea();
            ta.setText("12-");  // pre-set text 
            ta.textProperty().addListener((observable, oldValue, newValue) -> {
                ta.setText("1"); // changed text
            });
            AnchorPane root = new AnchorPane();
            root.getChildren().addAll(ta);
            Scene scene = new Scene(root,400,400);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

创建窗口后,TextArea 将显示“12-”。通过尝试在任意位置插入字符,TextArea 将变为“1”,但会产生以下异常:

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.updateContent(TextInputControl.java:564)
    at javafx.scene.control.TextInputControl.replaceText(TextInputControl.java:548)
    at com.sun.javafx.scene.control.behavior.TextAreaBehavior.replaceText(TextAreaBehavior.java:305)
    at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.defaultKeyTyped(TextInputControlBehavior.java:238)
    at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callAction(TextInputControlBehavior.java:139)
    at com.sun.javafx.scene.control.behavior.TextAreaBehavior.callAction(TextAreaBehavior.java:259)
    at com.sun.javafx.scene.control.behavior.BehaviorBase.callActionForEvent(BehaviorBase.java:218)
    at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callActionForEvent(TextInputControlBehavior.java:127)
    at com.sun.javafx.scene.control.behavior.BehaviorBase.lambda$new$74(BehaviorBase.java:135)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$KeyHandler.process(Scene.java:3964)
    at javafx.scene.Scene$KeyHandler.access$1800(Scene.java:3910)
    at javafx.scene.Scene.impl_processKeyEvent(Scene.java:2040)
    at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2501)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:197)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:147)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$354(GlassViewEventHandler.java:228)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:227)
    at com.sun.glass.ui.View.handleKeyEvent(View.java:546)
    at com.sun.glass.ui.View.notifyKey(View.java:966)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)

在更改文本之前清除也无济于事,因为即使只是清除文本,即。 ta.clear();,会导致同样的异常。有任何想法吗?是否已经有关于此的 JIRA 票?

【问题讨论】:

    标签: java exception javafx textarea listener


    【解决方案1】:

    对我来说,这似乎是一个错误。这不是第一次从一个版本到另一个版本发生这种情况。大多数时候,我会查看JavaFX Jira,看看是否有任何未解决的问题。我在这一点上没有找到它。作为一种解决方法,我建议使用另一个组件,如果您只想显示文本,可能是 Label 而不是 TextArea

    编辑:

    看看:

    https://bugs.openjdk.java.net/browse/JDK-8081700

    【讨论】:

    • 感谢您提供 Jira 信息。我可以使用 Label 输入文本吗?
    • 你到底想做什么?仅当您只想显示文本时,标签才可能作为替代方案。您不能使用标签输入文本。在您的示例中,您在 textarea 上有一个侦听器,但这是什么想法。用户更改文本后,您想做什么?
    • 我目前无法测试它,但是您是否尝试过使用 clear 然后 appendText(String text) 而不是 setText 来更改 textarea 中的文本?可能这会奏效。
    • 感谢您的提示。它可能会起作用。我想要做的是即时格式化用户输入的文本。例如,“112233AABBCC”将变为“11-22-33-AA-BB-CC-”。代码工作不会导致 JDK 1.8.0_25 中的异常,但插入符号没有正确设置。 JDK 1.8.0_51 修复了插​​入符号错误,但产生了异常。
    • 我会尝试如果您在更改之前清除文本会发生什么。
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 2020-06-14
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多