2017-07-24 29 views
0

我有3個領域:如何確定哪個TextField觸發了JavaFX中的EventHandler?

@FXML 
private TextField name; 

@FXML 
private TextField lastName; 

@FXML 
private TextField phoneNumber; 

我爲他們EventHandler創建:

EventHandler<InputEvent> fieldChangeListener = new EventHandler<InputEvent>() { 
      public void handle(InputEvent event) { 
       String input = ((TextField) event.getSource()).getText(); 
       System.out.println("Changed: "+event.getSource()); 
       event.consume(); 
      } 
     }; 

,並分配給他們:

name.addEventHandler(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED, fieldChangeListener); 
lastName.addEventHandler(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED, fieldChangeListener); 
phoneNumber.addEventHandler(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED, fieldChangeListener); 

我如何確定哪些我的3個領域之一觸發事件? 我想打電話給根據不同的功能上的一個改變,如: -

if(name){ 
function changedName(); 
} 
else if(lastName){ 
function changedLastName(); 
} 
else if(phoneNumber){ 
function changedPhoneNumber(); 
} 
+1

這將是更適合使用,而不是試圖爲所有3場的邏輯擠進一個單一的處理3個不同的事件處理程序。此外,爲什麼不使用方法來處理這些事件,並使用fxml中的'onInputMethodTextChanged'屬性來註冊處理程序? – fabian

回答

1

而是對所有的人設置一個事件處理程序的,創建3級不同的處理器

EventHandler<InputEvent> nameChangedHandler = (event) -> changedName(); 
EventHandler<InputEvent> lastNameChangedHandler = (event) -> changedLastName(); 
EventHandler<InputEvent> phoneNumberChangedHandler = (event) -> changedPhoneNumber(); 

,然後將它們添加到它們各自的TextField s。如果您使用的是單個事件處理程序,因爲在開始和結束時都有通用代碼,那麼只需將這些代碼重構爲單獨的函數,然後在所有事件處理程序中調用它們。

如果您仍需要一個明確的檢查,然後使用

Object source = event.getSource(); 
if(source == name) { 
    changedName(); 
} else if(source == lastName) { 
    changedLastName(); 
} else if(source == phoneNumber) { 
    changedPhoneNumber(); 
} 
1
TextField input = ((TextField) event.getSource()); 
input.getId(); 
相關問題