Tôi đang sử dụng một vài JFormattedTextField trong chương trình của mình. Đối với một số lý do khi trường văn bản tăng tiêu điểm sau khi nhấp chuột vào trường văn bản, vị trí dấu nháy luôn nhảy sang trái (vị trí 0). Tôi muốn dấu mũ kết thúc tại vị trí được người dùng nhấp vào. Vì vậy, nếu tôi nhấp vào giữa hai chữ số, dấu mũ sẽ kết thúc ở giữa hai chữ số đó.Vị trí dấu nháy JFormattedTextField trên tiêu điểm
Vì vậy, tôi đã triển khai một FocusListener sẽ nhận được vị trí nhấp chuột và đặt vị trí dấu mũ ở đó.
FocusListener focusListener = new FocusListener(){
public void focusGained(FocusEvent evt) {
JFormettedTextField jftf = (JFormattedTextField) evt.getSource();
//This is where the caret needs to be.
int dot = jftf.getCaret().getDot();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
'the textField that has focus'.setCaretPosition('Some how get the evt or dot');
}
});
}
public void focusLost (FocusEvent evt) {}
});
Tôi đã thử một số cách để làm việc của anh ấy. Tôi đã thử sử dụng từ khóa cuối cùng, hoạt động, nhưng chỉ cho một trường văn bản duy nhất.
Tôi đã sử dụng các phương pháp đặt/lấy bên trong trình nghe tập trung để gán đối tượng hiện tại, nhưng không chắc chắn về cách thực hiện điều này "an toàn" (ví dụ: chúng có cần được đồng bộ không?).
Có thể có điều gì đó tôi bị thiếu?
Câu trả lời hay! Nhưng tại sao bạn cần phải làm điều đó trong invokeLater()? Chẳng phải mousePressed() được gọi từ chuỗi sự kiện chưa? – Jonas
@Sanoj, Sự chậm trễ được giới thiệu bởi 'invokeLater' là cần thiết để nó hoạt động. Thông thường khi trường được nhấn, nó sẽ lấy tiêu điểm, làm cho trình định dạng định dạng lại giá trị và cập nhật văn bản trường. Một tác dụng phụ của điều đó là caret được di chuyển. Với 'invokeLater', phương thức' run() 'này không thực hiện cho đến khi xử lý sự kiện trọng tâm đã hoàn thành, vì vậy bạn biết rằng một khi bạn đặt dấu mũ ở đúng nơi nó sẽ ở đó. – finnw
Cảm ơn bạn đã giải thích! – Jonas