2015-06-17 18 views
5

Tôi có một điều khiển JavaFX TextField trên FXMl của tôi trông như thế này ...JavaFX TextField: Tự động chuyển đổi văn bản sang chữ hoa

<TextField fx:id="input_search" onKeyPressed="#keyListener" prefHeight="25.0" prefWidth="197.0" /> 

Tôi muốn tự động thay đổi tất cả các ký tự để hoa khi người dùng đang nhập.

mã trong bộ điều khiển của tôi:

public void keyListener(KeyEvent event){ 
    //maybe transform the pressed key to uppercase here... 
} 

Trả lời

9

Thay vì sử dụng onKeyPressed trên TextField của bạn, sử dụng textProperty() của TextField của bạn. Chỉ cần thêm mã sau vào bên trong initialize() của bộ điều khiển.

input_search.textProperty().addListener((ov, oldValue, newValue) -> { 
    input_search.setText(newValue.toUpperCase()); 
}); 
+0

Cảm ơn, điều này hoạt động Magic! – Martin

5

Bắt đầu với JavaFX 8u40, bạn có thể đặt đối tượng TextFormatter trên trường văn bản. Điều này cho phép bạn áp dụng bộ lọc/bộ chuyển đổi trên đầu vào của người dùng. Here's an example.

Lắng nghe các thay đổi trong thuộc tính văn bản đi kèm với nhược điểm kích hoạt hai sự kiện thay đổi, một cho đầu vào ban đầu (trong trường hợp của bạn là ký tự chữ thường) và một cho đầu vào đã sửa (ký tự chữ hoa) . Nếu có những người nghe khác trên thuộc tính văn bản, họ sẽ cần phải giải quyết cả hai sự kiện và quyết định sự kiện nào phù hợp với họ. Cách tiếp cận TextFormatter không có nhược điểm này.

+0

Cảm ơn, tôi đã học được điều gì đó mới mẻ. Nhưng dường như có một nhược điểm khác. Một TextField với một tập TextFormatter dường như tiêu thụ ESC KeyEvent. Tôi không có thời gian để nghiên cứu nó bây giờ nhưng lý do có thể là với TextFormatter thiết lập, ESC được sử dụng để hủy bỏ chỉnh sửa hiện tại: http://stackoverflow.com/a/38059343/3519572 – tomorrow

Các vấn đề liên quan