2017-01-09 160 views
0

我的java swing應用程序有一個JTextFied。我是一個PlainDocument子類用於輸入操作。Java Swing - 如何將光標定位在PlainDocument的JTextField中

public class MaskDecimalDocument extends PlainDocument { 

    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { 

     //manipulation input code 

     super.insertString(0, manipulatedText, a); 

    } 

} 

用戶插入一個字符,insertString方法處理字符並將其插入到文本中。下一次操作時,光標位於文本的末尾。如何將光標置於原始位置?

回答

1

您可能需要考慮使用DocumentFilter,因爲它是處理對Document的更改的新API。這個概念是相同的,但是這個類更加可重用,因爲它可以被添加到任何Document

有關更多信息,請參閱Swing教程Implementing a DocumentFilter中的部分。

如何將光標置於原來的位置?

當您創建自定義DocumentFilter類,你需要在使用的Document作爲參數的文本字段通過這個文本字段保存爲您的類的實例變量。

然後在replaceSelection(...)方法的邏輯是這樣的:

int caretPosition = textField.getCaretPosition(); 
super.replaceSelection(...); 
textField.setCaretPosition(caretPosition); 

注意您可能需要放置在一個SwingUtilities.invokeLater()setCaretPosition(...)方法來確保代碼的默認處理後執行設置尖號位置。

1

控制插入位置不是Document的工作。您應該set a NavigationFilter忽略對插入位置的所有更改:

textField.setNavigationFilter(new NavigationFilter() { 
    @Override 
    public void setDot(FilterBypass bypass, 
         int position, 
         Position.Bias bias) { 
     // Deliberately empty 
    } 

    @Override 
    public void moveDot(FilterBypass bypass, 
         int position, 
         Position.Bias bias) { 
     // Deliberately empty 
    } 

    @Override 
    public int getNextVisualPositionFrom(JTextComponent component, 
             int position, 
             Position.Bias bias, 
             int direction, 
             Position.Bias[] newBias) { 
     return position; 
    } 
});