You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX TextField输入触发StringIndexOutOfBoundsException问题求助

Windows 11 23H2下JavaFX TextField输入时周期性抛出StringIndexOutOfBoundsException

在Windows 11 Pro 23H2系统中,运行极简JavaFX TextField代码时,向文本框输入内容会周期性抛出StringIndexOutOfBoundsException。测试过JDK 21.0.0、21.0.2及1.8版本,JavaFX对应8.0.65和21+31版本,重装JDK后问题仍未解决。

版本信息

JDK: 21.0.0, 21.0.2, 1.8
JavaFX: 
javafx.runtime.version=8.0.65 javafx.runtime.build=b17
javafx.version=21 javafx.runtime.version=21+31 javafx.runtime.build=31
Windows:
Edition=Windows 11 Pro, Version=23H2

错误日志

Exception in thread "JavaFX Application Thread" java.lang.StringIndexOutOfBoundsException: Range [1, -2147483648) out of bounds for length 1
    at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
    at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
    at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
    at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)
    at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)
    at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4861)
    at java.base/java.lang.String.substring(String.java:2830)
    at javafx.graphics@21/com.sun.glass.ui.win.WinTextRangeProvider.GetText(WinTextRangeProvider.java:367)
    at javafx.graphics@21/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics@21/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:185)
    at java.base/java.lang.Thread.run(Thread.java:1583)

测试源码

package comp3111.qsproject;

// 创建TextField并添加到舞台的Java程序
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class TextFieldTest extends Application {

    // 启动应用
    public void start(Stage s)
    {
        // 设置舞台标题
        s.setTitle("creating TextField");

        // 创建文本框
        TextField b = new TextField();

        // 创建栈面板
        StackPane r = new StackPane();

        // 添加文本框到面板
        r.getChildren().add(b);

        // 创建场景
        Scene sc = new Scene(r, 200, 200);

        // 设置场景到舞台
        s.setScene(sc);

        s.show();
    }

    public static void main(String args[])
    {
        // 启动应用
        launch(args);
    }
}

问题分析与解决建议

从错误栈追踪可以看到,异常来自WinTextRangeProvider.GetText方法,这是JavaFX在Windows平台上处理辅助功能(如屏幕阅读器、系统语音交互)的模块,推测是Windows辅助功能与JavaFX文本组件交互时的兼容性bug。

可行的解决方法:

  • 禁用JavaFX辅助功能支持:启动程序时添加JVM参数 -Djavafx.accessibility.enabled=false,避免辅助功能模块的干扰。
  • 检查系统辅助功能设置:暂时关闭Windows的讲述人、语音访问等辅助功能,看是否能缓解问题。
  • 升级JavaFX版本:尝试更新到最新的JavaFX稳定版,官方可能已经修复了该平台特定的bug。

内容的提问来源于stack exchange,提问作者Super3001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:25:21