2017-04-04 124 views
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)?

回答

1

請看看這個答案https://stackoverflow.com/a/32893573/814304

您正試圖改變內部事件文本,這正是你不要以爲做。

+1

回答問題指的是更改文本屬性更改偵聽器中文本字段的文本值,這不是問題中的示例代碼嘗試執行的操作,至少不是直接。雖然你是正確的,這是堆棧跟蹤中發生的情況,所以問題似乎在JavaFX庫代碼中,而不是發佈的代碼。也許是這樣的:http://bugreport.java.com – jewelsea

+0

我改變了按鈕動作EventHandler的文本框中的文本。我被允許這樣做是對的? 一種解決方法是設置空字符串「」而不是空 - 然後我可以單擊按鈕多次我想要沒有例外。 另外我也向oracle報告過。 – Wojtek

+0

也使用textfield.clear()正常工作 – Wojtek