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);
}
}
}
Đ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? –
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