我已修改NumberFormatter為具有貨幣實體(帶前綴)。當我寫第一個數字時,此應用程式已將前綴添加到數字
JFormattedTextField Empty
但是當我這樣做時,插入符號位置會在第一個數字之前發生變化
enter image description here
我怎樣才能通過只修改formato()回傳 a 的方法來解決這個NumberFormatter問題JFormattedTextField?
textFieldMonto = new javax.swing.JFormattedTextField(formato());
這是方法:
private NumberFormatter formato() {
DecimalFormat myFormatter = new DecimalFormat("'Gs. '###,##0;'Gs. '###,##0");
NumberFormatter numberFormatter = new NumberFormatter(myFormatter) {
// this change caret to the end in every focus gained
@Override
public void install(JFormattedTextField pField) {
super.install(pField);
pField.setCaretPosition(pField.getDocument().getLength());
}
// allow empty text on JFormattedTextField and dont allow negative numbers
@Override
public String valueToString(Object value) throws ParseException {
String result = super.valueToString(value);
if(super.valueToString(value).startsWith("-"))
result = result.replaceFirst("-", ""); // this block every negative number
if(value==null)
return "";
return result;
}
// allow empty text on JFormattedTextField and dont allow negative numbers
@Override
public Object stringToValue(String text) throws ParseException {
if (text.length() == 0 || text.equals("Gs. ")) // if is empty or only have the prefix, return null
return null;
text.replaceFirst("-", ""); // this block every negative number
if(!text.startsWith("Gs. ")) //if is empty, add the prefix "Gs. " to the number
text = "Gs. " text;
return super.stringToValue(text);
}
};
numberFormatter.setAllowsInvalid(false); //this is the key!!
numberFormatter.setMaximum(new BigDecimal("999999999999"));// maximum number to put
numberFormatter.setCommitsOnValidEdit(true);// commit value on each keystroke instead of focus lost
return numberFormatter;
}
uj5u.com熱心網友回復:
我認為您問題的代碼中的這條評論不是真的:
// this change caret to the end in every focus gained
install每次JFormattedTextField獲得焦點時都不會呼叫方法。根據我的測驗,只有在JFormattedTextField創建物件時才會呼叫它。
根據javadoc:
如果子類希望在
JFormattedTextField.
因此,我建議在方法中將DocumentListener添加到的檔案中。JFormattedTextFieldinstall
請注意,還有其他由SwingDocumentListener基礎結構設定的 s,并且由于當存在多個 s 時無法保證執行順序,因此在下面的代碼中,實作使用invokeLater來確保我添加的偵聽器最后運行。DocumentListener
這是我對你的formato方法的重寫。
我唯一改變的是 method install。
private NumberFormatter formato() {
DecimalFormat myFormatter = new DecimalFormat("'Gs. '###,##0;'Gs. '###,##0");
NumberFormatter numberFormatter = new NumberFormatter(myFormatter) {
// this change caret to the end in every focus gained
@Override
public void install(JFormattedTextField pField) {
super.install(pField);
pField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
EventQueue.invokeLater(() -> pField.setCaretPosition(pField.getDocument().getLength()));
}
@Override
public void removeUpdate(DocumentEvent e) {
EventQueue.invokeLater(() -> pField.setCaretPosition(pField.getDocument().getLength()));
}
@Override
public void changedUpdate(DocumentEvent e) {
// Do nothing.
}
});
}
// allow empty text on JFormattedTextField and don't allow negative numbers
@Override
public String valueToString(Object value) throws ParseException {
String result = super.valueToString(value);
if(super.valueToString(value).startsWith("-"))
result = result.replaceFirst("-", ""); // this block every negative number
if(value==null)
return "";
return result;
}
// allow empty text on JFormattedTextField and don't allow negative numbers
@Override
public Object stringToValue(String text) throws ParseException {
if (text.length() == 0 || text.equals("Gs. ")) // if is empty or only have the prefix, return null
return null;
text.replaceFirst("-", ""); // this block every negative number
if(!text.startsWith("Gs. ")) //if is empty, add the prefix "Gs. " to the number
text = "Gs. " text;
return super.stringToValue(text);
}
};
numberFormatter.setAllowsInvalid(false); //this is the key!!
numberFormatter.setMaximum(new BigDecimal("999999999999"));// maximum number to put
numberFormatter.setCommitsOnValidEdit(true);// commit value on each keystroke instead of focus lost
return numberFormatter;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/537323.html
標籤:爪哇摇摆jtextfield插入符号jformattedtextfield
