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
相关产品推荐
相关产品推荐

