我在程序中使用了幾個JFormattedTextField。出於某種原因,當文本字段點擊文本字段後,文本字段獲得焦點時,插入符總是跳到左側(位置0)。我希望插入符號最終位於用戶點擊的位置。所以如果我在兩位數之間點擊,那麼插入符應該在兩位數之間結束。JFormattedTextField插入焦點位置
所以我實現了一個FocusListener,它將得到點擊位置並在那裏設置插入符的位置。
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) {}
});
我試過很多東西讓他上班。我嘗試過使用final關鍵字,它可以工作,但只適用於單個文本框。我已經在焦點偵聽器中使用set/get方法來分配當前對象,但我不知道如何使這個「安全」(例如他們需要同步嗎?)。
也許有一些我失蹤?
很好的答案!但爲什麼你需要在invokeLater()中做到這一點?無論如何,是不是從event-thread調用mousePressed()? – Jonas 2010-02-04 20:42:17
@Sanoj,'invokeLater'引入的延遲對於它的工作是必要的。通常當單擊該字段時,它會獲得焦點,這會導致格式化程序重新格式化該值並更新字段文本。這樣做的副作用是脫字符被移動。使用'invokeLater',這個'run()'方法在焦點事件處理完成之前不會執行,所以你知道一旦你把插入符號放在正確的地方,它就會停留在那裏。 – finnw 2010-02-04 21:10:37
感謝您的解釋! – Jonas 2010-02-04 23:01:50