1
我遇到了JavaFX textformatter的問題。我想知道如果我做錯了什麼或Java JDK中存在錯誤。JavaFX TextFormatter空文本問題
這裏是代碼,顯示問題:
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 =測試
其次,每一次新的嘗試導致異常:
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)?
回答問題指的是更改文本屬性更改偵聽器中文本字段的文本值,這不是問題中的示例代碼嘗試執行的操作,至少不是直接。雖然你是正確的,這是堆棧跟蹤中發生的情況,所以問題似乎在JavaFX庫代碼中,而不是發佈的代碼。也許是這樣的:http://bugreport.java.com – jewelsea
我改變了按鈕動作EventHandler的文本框中的文本。我被允許這樣做是對的? 一種解決方法是設置空字符串「」而不是空 - 然後我可以單擊按鈕多次我想要沒有例外。 另外我也向oracle報告過。 – Wojtek
也使用textfield.clear()正常工作 – Wojtek