2013-05-14 24 views

回答

57

TextField yourTextField = new TextField(); 
yourTextField.focusedProperty().addListener(new ChangeListener<Boolean>() 
{ 
    @Override 
    public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) 
    { 
     if (newPropertyValue) 
     { 
      System.out.println("Textfield on focus"); 
     } 
     else 
     { 
      System.out.println("Textfield out focus"); 
     } 
    } 
}); 

我希望這個答案很有幫助!

+3

這是在焦點實際改變之前還是之後執行的? – 2015-09-01 20:23:47

+0

值得注意的是,即使應用程序在'yourTextField'有焦點時關閉,'changed'仍然會被調用。這對我來說是非常不可取的,我通過沿着'primaryStage.setOnCloseRequest(event-> {removeListeners(); })行的方式來解決它;'' – Jake 2016-07-08 19:49:31

8

您將要連接將ChangeListener添加到您希望監視的TextField的FocusProperty中。

在JavaFX中,只要屬性滿足JavaFX bean的最小定義,就可以將通知事件(更改或無效偵聽器)附加到對象可能擁有的任何JavaFX屬性。

請參閱這篇文章,如果你的事件處理程序會做其他的東西,如修改取消或默認按鈕設置:JavaFX 2 -- Setting the defaultButton property: mutually exclusive?

下面是一些代碼的變化監聽附加到文本框:

txtDx.focusedProperty().addListener(m_txtDxListener); 

Listener對象已存儲在實例字段中,因此它可以與addListener()和removeListener()一起使用。對於短暫的TextField,您可以使用匿名內部類指定偵聽器對象。

這裏是我寫了我的焦點偵聽器,專用類:我想這可能是有益的,看看它指定的ChangeListener像提到scottb匿名內部類的例子

private class FocusPropertyChangeListener implements ChangeListener<Boolean> { 

    FocusPropertyChangeListener() { System.out.println("New FPCL instance"); } 

    @Override 
    public void changed(ObservableValue<? extends Boolean> ov, 
     Boolean oldb, Boolean newb) { 
     System.out.println("Focus change triggered"); 

     if (ancEncEditor.isVisible() && !ancEncEditor.isDisabled()) { 
      boolean b = (newb != null && newb.booleanValue() == true); 
      System.out.println("txtDx focus change event triggered: DxAdd = " + b); 

      if (b) { btnDxAdd.setDefaultButton(true); } 
      else { btnWindowCommit.setDefaultButton(true); } 
      btnWindowCommit.setCancelButton(true); 
      btnDxAdd.setDefaultButton(b); 
     } 
    } 
} 
+0

Scottb ....我不能理解。你可以舉一個小例子 – 2013-05-14 18:13:56

+2

java baba,只需在TextField的focusedProperty()中添加一個簡單的更改監聽器,然後檢查它現在處於哪種焦點狀態(true/false)。 – 2013-05-14 21:38:32

4

您可以使用focusedPropertyNode附加ChangeListener

從布倫丹擴展答案:從JavaFX8(因爲它自帶的Java 8),lambda表達式與三元運算相結合,可使其真正緊湊:

textField.focusedProperty().addListener((obs, oldVal, newVal) -> 
    System.out.println(newVal ? "Focused" : "Unfocused")); 
相關問題