2013-05-14 28 views

Trả lời

57

tôi nghĩ rằng nó có thể hữu ích để xem một ví dụ trong đó nêu rõ các ChangeListener như một lớp bên trong vô danh như scottb đề cập.

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"); 
     } 
    } 
}); 

Tôi hy vọng câu trả lời này hữu ích!

+3

Điều này có thực thi trước hoặc sau khi tiêu điểm thực sự thay đổi không? –

+0

Cần lưu ý rằng 'đã thay đổi' sẽ vẫn được gọi ngay cả khi ứng dụng được đóng trong khi' yourTextField' đã tập trung. Điều này là rất không mong muốn đối với tôi, và tôi đã đi xung quanh nó bằng cách làm một cái gì đó dọc theo dòng 'primaryStage.setOnCloseRequest (sự kiện -> { removeListeners(); });' – Jake

8

Bạn sẽ muốn đính kèm một ChangeListener đến FocusProperty của TextField mà bạn muốn theo dõi. Trong JavaFX, bạn có thể đính kèm các sự kiện thông báo (Thay đổi hoặc Trình nghe không hợp lệ) vào bất kỳ thuộc tính JavaFX nào mà một đối tượng có thể sở hữu miễn là thuộc tính đáp ứng định nghĩa tối thiểu cho một hạt JavaFX.

Tham khảo bài này nếu xử lý sự kiện của bạn sẽ được làm những việc khác như điều chỉnh Hủy bỏ hoặc nút Default thiết lập: JavaFX 2 -- Setting the defaultButton property: mutually exclusive?

Dưới đây là một số mã để đính kèm một Listener Thay đổi để một hộp văn bản:

txtDx.focusedProperty().addListener(m_txtDxListener); 

Đối tượng Listener đã được lưu trữ trong một trường thể hiện để nó có thể được sử dụng với cả addListener() và removeListener(). Đối với một TextField ngắn ngủi, bạn có thể chỉ định đối tượng listener với một lớp bên trong vô danh.

Đây là lớp tin rằng tôi đã viết cho người nghe tập trung của tôi:

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 .... tôi vẫn chưa thể hiểu không. Bạn có thể vui lòng đưa ra một ví dụ nhỏ –

+2

java baba, chỉ cần thêm một trình lắng nghe thay đổi đơn giản trên focusProperty() của TextField và kiểm tra, loại trạng thái tập trung nào (true/false) hiện tại. –

4

Bạn có thể sử dụng focusedProperty của Node để đính kèm ChangeListener.

Mở rộng câu trả lời từ Brendan: từ JavaFX8 (vì nó đi kèm với Java 8), một biểu thức lambda kết hợp với một nhà điều hành ternary thể làm cho nó thực sự nhỏ gọn:

textField.focusedProperty().addListener((obs, oldVal, newVal) -> 
    System.out.println(newVal ? "Focused" : "Unfocused")); 
Các vấn đề liên quan