2013-11-26 49 views
2

我有這個字段,我在其中插入端口號。我想將字符串自動轉換爲數字:用TextField中的數字替換文本

fieldNport = new TextField(); 
    fieldNport.setPrefSize(180, 24); 
    fieldNport.setFont(Font.font("Tahoma", 11)); 
    grid.add(fieldNport, 1, 1); 

你能告訴我該如何做到這一點嗎?我無法在堆棧溢出中找到合適的示例。

編輯:

也許這:

fieldNport.textProperty().addListener(new ChangeListener() 
     { 
      @Override 
      public void changed(ObservableValue o, Object oldVal, Object newVal) 
      { 
       try 
       { 
        int Nport = Integer.parseInt((String) oldVal); 
       } 
       catch (NumberFormatException e) 
       { 

       } 
      } 
     }); 
+0

編寫一個讀取TextField文本並刪除字母的偵聽器。 – Fabinout

+0

例子?我對JavaFX有非常基礎的知識? –

+0

這個'Integer.parseInt(fieldNport.getText())'呢? –

回答

2

你可以寫這樣的事情:

fieldNPort.text.addListener(new ChangeListener(){ 
     @Override public void changed(ObservableValue o,Object oldVal, Object newVal){ 
      //Some Code 
      //Here you can use Integer.parseInt methods inside a try/catch 
      //because parseInt throws Exceptions 
     } 
     }); 

這裏是所有你需要關於JavaFX的特性和聽衆的事情:
http://docs.oracle.com/javafx/2/binding/jfxpub-binding.htm
如果您有任何問題,我很樂意提供幫助。

+0

你確定嗎?我用例子更新了這篇文章。 –

+0

fieldNPort.textProperty()。addListener(...,你是對的 – Fabinout

+0

我再次更新了代碼,你能推薦我改進一下代碼嗎? –

2

也許這就是你需要:

fieldNPort= new TextField() 
    { 
     @Override 
     public void replaceText(int start, int end, String text) 
     { 
      if (text.matches("[0-9]*")) 
      { 
       super.replaceText(start, end, text); 
      } 
     } 

     @Override 
     public void replaceSelection(String text) 
     { 
      if (text.matches("[0-9]*")) 
      { 
       super.replaceSelection(text); 
      } 
     } 
    }; 

這將進入任何東西,但數字(可以修改正則表達式您的需要)限制的用戶,然後你不必擔心Integer.parseInt投擲任何異常。

5

使用JavaFX 8u40開始,你可以在一個文本字段設置TextFormatter對象:

UnaryOperator<Change> filter = change -> { 
    String text = change.getText(); 

    if (text.matches("[0-9]*")) { 
     return change; 
    } 

    return null; 
}; 
TextFormatter<String> textFormatter = new TextFormatter<>(filter); 
fieldNport = new TextField(); 
fieldNport.setTextFormatter(textFormatter); 

這避免了兩個子類化和重複變化的事件,你會得到當你添加一個變化監聽到文本屬性和修改該偵聽器中的文本。