2016-09-02 2 views
3

Это мой код:jFormatedTextField формат валюта на реальное время ввода данных пользователя

// create the formatters, default, display, edit 
NumberFormatter defaultFormatter = new NumberFormatter(new DecimalFormat("#.##")); 
NumberFormatter displayFormatter = new NumberFormatter(new DecimalFormat("#.##€")); 
NumberFormatter editFormatter = new NumberFormatter(new DecimalFormat("#.##")); 
// set their value classes 
defaultFormatter.setValueClass(Double.class); 
displayFormatter.setValueClass(Double.class); 
editFormatter.setValueClass(Double.class); 
// create and set the DefaultFormatterFactory 
DefaultFormatterFactory valueFactory = new DefaultFormatterFactory(defaultFormatter,displayFormatter,editFormatter); 
jFormattedTextField4.setFormatterFactory(valueFactory); 
jFormattedTextField1.setFormatterFactory(valueFactory); 

Я получаю вопросы, когда вводимый пользователя значение с точкой, как (2.33), изменение formatedtextfield к (2 €), и это не так, потому что пользователь ввел действительное значение. Если пользователь вводит (2,33), результат равен (2,33) и снова не допускается, так как должен быть (2.33)

В принципе, я всегда хочу формат (X.XX). Пример:

вход против того, что я хочу: 2-2.00 €/ 2,22-2.22 €/ 312.54-312.54 €/ 432-432.00 €/ 2,2-2.20 €

EDITED: неделю назад это работало, после того как я смонтировал этот проект в других окнах, проблема возникла. В это время у меня есть португальская клавиатура. Возможно ли, что проблема связана с любыми окнами или системным свойством?

Отредактировано: Я все еще ища помощь. Кто угодно??? : S

ответ

1
  • вы должны использовать getCurrencyInstance(), вместо простой ванили DecimalFormat, убедитесь, что что-то пошло не так в вашем описании («one week ago this was working, after i mount this project in another windows the issue appear....»)

  • и/или там вы можете определить Formatter ограниченный по Locale

  • Я бы не использовать CurrencyInstance, не хорошо для меня, есть возможность заставить реальное сокращенное имя (например, Euro = EUR) с помощью NavigationFilter и обугливается позы ition в ряд с setDot/moveDot, code example by @camickr

  • здесь простые стандарты, по умолчанию Thats вам требуется,

enter image description here

import java.awt.*; 
import java.awt.font.TextAttribute; 
import java.math.*; 
import java.text.*; 
import java.util.Map; 
import javax.swing.*; 
import javax.swing.JFormattedTextField.*; 
import javax.swing.event.*; 
import javax.swing.text.InternationalFormatter; 

public class DocumentListenerAdapter { 

    public DocumentListenerAdapter() { 
     JFrame frame = new JFrame("AbstractTextField Test"); 
     final JFormattedTextField textField1 = new JFormattedTextField(new Double(10.01)); 
     textField1.setFormatterFactory(new AbstractFormatterFactory() { 
      @Override 
      public AbstractFormatter getFormatter(JFormattedTextField tf) { 
       NumberFormat format = DecimalFormat.getCurrencyInstance(); 
       format.setMinimumFractionDigits(2); 
       format.setMaximumFractionDigits(2); 
       format.setRoundingMode(RoundingMode.HALF_UP); 
       InternationalFormatter formatter = new InternationalFormatter(format); 
       formatter.setAllowsInvalid(false); 
       //formatter.setMinimum(0.0); 
       //formatter.setMaximum(1000.00); 
       return formatter; 
      } 
     }); 
     final Map attributes = (new Font("Serif", Font.BOLD, 16)).getAttributes(); 
     attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON); 
     final JFormattedTextField textField2 = new JFormattedTextField(new Double(10.01)); 
     textField2.setFormatterFactory(new AbstractFormatterFactory() { 
      @Override 
      public AbstractFormatter getFormatter(JFormattedTextField tf) { 
       NumberFormat format = DecimalFormat.getInstance(); 
       format.setMinimumFractionDigits(3); 
       format.setMaximumFractionDigits(3); 
       format.setRoundingMode(RoundingMode.HALF_UP); 
       InternationalFormatter formatter = new InternationalFormatter(format); 
       formatter.setAllowsInvalid(false); 
       //formatter.setMinimum(0.0); 
       //formatter.setMaximum(1000.00); 
       return formatter; 
      } 
     }); 
     textField2.getDocument().addDocumentListener(new DocumentListener() { 
      @Override 
      public void changedUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      @Override 
      public void insertUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent documentEvent) { 
       printIt(documentEvent); 
      } 

      private void printIt(DocumentEvent documentEvent) { 
       DocumentEvent.EventType type = documentEvent.getType(); 
       double t1a1 = (((Number) textField2.getValue()).doubleValue()); 
       if (t1a1 > 1000) { 
        Runnable doRun = new Runnable() { 
         @Override 
         public void run() { 
          textField2.setFont(new Font(attributes)); 
          textField2.setForeground(Color.red); 
         } 
        }; 
        SwingUtilities.invokeLater(doRun); 
       } else { 
        Runnable doRun = new Runnable() { 
         @Override 
         public void run() { 
          textField2.setFont(new Font("Serif", Font.BOLD, 16)); 
          textField2.setForeground(Color.black); 
         } 
        }; 
        SwingUtilities.invokeLater(doRun); 
       } 
      } 
     }); 
     //https://stackoverflow.com/a/20008786/714968 
     JFormattedTextField jftf2 = new JFormattedTextField(); 
     final InternationalFormatter fmt = new InternationalFormatter(
       new MessageFormat("{0,number,000}-{1,number,0000}")); 
     jftf2.setFormatterFactory(new JFormattedTextField.AbstractFormatterFactory() { 
      @Override 
      public JFormattedTextField.AbstractFormatter getFormatter(JFormattedTextField tf) { 
       return fmt; 
      } 
     }); 
     jftf2.setValue(new Object[]{111, 1234}); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(textField1, BorderLayout.NORTH); 
     frame.add(textField2, BorderLayout.CENTER); 
     frame.add(jftf2, BorderLayout.SOUTH); 
     frame.setVisible(true); 
     frame.pack(); 
    } 

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       DocumentListenerAdapter main = new DocumentListenerAdapter(); 
      } 
     }); 
    } 
} 
+0

К сожалению, я не понимаю ваш код = \ – user3753426

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