Я создал пользовательский JTextFields, который может принимать только числовые значения.Как получить двойное значение из пользовательского jtextfield
Так у меня есть это:
package com.mcsolution.common.Componenti_Swing;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import com.mcsolution.common.supporto.VisualMessage;
public class DoubleTextFieldFormat extends TextFieldFormat{
/**
*
*/
private static final long serialVersionUID = 8856130645860365803L;
public DoubleTextFieldFormat(){
addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
char ch = e.getKeyChar();
if (!isNumber(ch) && !isValidSignal(ch) && !validatePoint(ch) && ch != '\b') {
e.consume();
}
}
});
}
public DoubleTextFieldFormat(Font font,Boolean isSelectedAll,Integer horizzontalAlignment,
Integer numberCharacter,String text,Dimension preferredSize,
Boolean isEditable){
if(font!=null)
this.setFont(font);
if(isSelectedAll){
this.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e){
selectAll();
}
public void focusLost(FocusEvent e){
}
});
}
if(horizzontalAlignment!=null)
this.setHorizontalAlignment(horizzontalAlignment);
if(numberCharacter!=null)
this.setDocument(new PersonalizzaJtextField(numberCharacter));
if(text!=null)
this.setText(text);
if(preferredSize!=null)
this.setPreferredSize(preferredSize);
if(isEditable!=null)
this.setEditable(isEditable);
addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
char ch = e.getKeyChar();
if (!isNumber(ch) && !isValidSignal(ch) && !validatePoint(ch) && ch != '\b') {
e.consume();
}
}
});
}
private boolean isNumber(char ch){
return ch >= '0' && ch <= '9';
}
private boolean isValidSignal(char ch){
if((getText() == null || "".equals(getText().trim())) && ch == '-'){
return true;
}
return false;
}
private boolean validatePoint(char ch){
if(ch != '.'){
return false;
}
if(getText() == null || "".equals(getText().trim())){
setText("0.");
return false;
}else if("-".equals(getText())){
setText("-0.");
}
return true;
}
public Double getValue(){
try{
String valore = this.getText();
valore= valore.replaceAll(",", ".");
return Double.parseDouble(valore);
}catch(Exception e){
VisualMessage.getErrore();
return null;
}
}
}
Теперь, если я хочу получить значение я использую этот код:
Double val = myTextField.getValue();
Этот метод работает не каждый раз.
Например, если у меня есть это значение в TextField 1.900,50, если есть ошибка.
Как преобразовать значение в этом формате x.xxx, xx?
Не используйте 'KeyListener' для фильтрации компонент текста, использовать в' DocumentFilter' вместо этого. См. [Реализация фильтра документов] (http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter) и [Примеры DocumentFilter] (http://www.jroller.com/dpmihai/ entry/documentfilter) для более подробной информации. – MadProgrammer
Вы должны использовать JSpinner или JFormattedTextField, поскольку они уже предоставляют эту функцию. См. [Как использовать прядильщики] (http://docs.oracle.com/javase/tutorial/uiswing/components/spinner.html) и [Как использовать форматированные текстовые поля] (http://docs.oracle.com/ javase/tutorial/uiswing/components/formattedtextfield.html) для более подробной информации – MadProgrammer
Лично я удаляю форматирование (','), а затем полагаюсь на 'Double.parseDouble' – MadProgrammer