2015-10-28 2 views
0

Я создал пользовательский 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?

+1

Не используйте 'KeyListener' для фильтрации компонент текста, использовать в' DocumentFilter' вместо этого. См. [Реализация фильтра документов] (http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#filter) и [Примеры DocumentFilter] (http://www.jroller.com/dpmihai/ entry/documentfilter) для более подробной информации. – MadProgrammer

+1

Вы должны использовать JSpinner или JFormattedTextField, поскольку они уже предоставляют эту функцию. См. [Как использовать прядильщики] (http://docs.oracle.com/javase/tutorial/uiswing/components/spinner.html) и [Как использовать форматированные текстовые поля] (http://docs.oracle.com/ javase/tutorial/uiswing/components/formattedtextfield.html) для более подробной информации – MadProgrammer

+0

Лично я удаляю форматирование (','), а затем полагаюсь на 'Double.parseDouble' – MadProgrammer

ответ

0

Я установил свою ошибку, я изменить метод моего ПолучитьЗначения() с этим:

public Double getValue(){ 
    try{ 
     NumberFormat nf = NumberFormat.getInstance(Locale.getDefault()); 
     //String valore = ; 
     return nf.parse(this.getText()).doubleValue(); 

    }catch(Exception e){ 
     VisualMessage.getErrore(); 
     return null; 
    } 
} 
+0

Итак, теперь ваш код работает только для ITALIAN locale (и аналогичного). Как насчет использования Locale.default для поддержки настройки пользователей. Не заглядывали в свой код, чтобы убедиться, что это единственное, что необходимо для поддержки всех локалей. – mattiash

Смежные вопросы