2013-11-22 39 views
1

我需要這樣一個數字文本字段上的JFrame該如何在Swing中定義格式化文本字段,以便在鍵入時應用格式限制?

  1. 由若干限制輸入帶小數點 點後兩位數字
  2. 勾畫出分離每三位數字即1 234 567,89數。
  3. 數輸入

中顯示正確的格式馬上 我嘗試使用的JFormattedTextField:

NumberFormat nf = NumberFormat.getNumberInstance(); 
    nf.setMaximumFractionDigits(2); 
    NumberFormatter numFormater = new NumberFormatter(nf); 
    field1 = new javax.swing.JFormattedTextField(numFormater); 

然而,只有當焦點離開該組件,這是一個問題的格式restricitions適用。我希望用戶只能在字段中輸入數字和分隔符,並且在每個三位數字輸入字段後立即放置空格分隔符。

我可以通過指定字段的屬性在C#中完成此操作。什麼是Swing中乾淨的方式? 謝謝。

回答

0

如何在字段中添加KeyListener並在鍵入鍵時重新格式化?

+0

什麼是調用重新格式化的正確方法?切換組件之間的焦點似乎並不乾淨,並且存在插入錯誤的問題。 – user3021050

6
  • 的方式之一是使用InternationalFormatter其是附加FormatterNumber or DecimalFormatter

  • JFormattedTextField每限制性副作用爲用戶輸入,例如CaretSelection

  • 適當的與DocumentListener方式可以是組合DocumentFilterDocumentListener加入JFormattedTextField用普通Number or DecimalFormatter的使用,沒有任何限制,所有的解決方法將在兩個DocumentFilter(指定更改內部Document)來設定(文檔以外)

例如提到InternationalFormatter

import java.awt.*; 
import java.math.*; 
import java.text.*; 
import javax.swing.*; 
import javax.swing.JFormattedTextField.AbstractFormatter; 
import javax.swing.JFormattedTextField.AbstractFormatterFactory; 
import javax.swing.text.InternationalFormatter; 

public class DocumentListenerAdapter { 

    public DocumentListenerAdapter() { 
     JFrame frame = new JFrame("AbstractTextField Test"); 
     final JFormattedTextField textField1 = new JFormattedTextField(new Float(10.01)); 
     textField1.setFormatterFactory(new AbstractFormatterFactory() { 
      @Override 
      public AbstractFormatter getFormatter(JFormattedTextField tf) { 
       NumberFormat format = DecimalFormat.getInstance(); 
       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; 
      } 
     }); 
     NumberFormat numberFormat = NumberFormat.getNumberInstance(); 
     numberFormat.setMaximumFractionDigits(2); 
     numberFormat.setMaximumFractionDigits(2); 
     numberFormat.setRoundingMode(RoundingMode.HALF_UP); 
     final JFormattedTextField textField2 = new JFormattedTextField(numberFormat); 
     textField2.setValue(new Float(10.01)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(textField1, BorderLayout.NORTH); 
     frame.add(textField2, BorderLayout.SOUTH); 
     frame.setVisible(true); 
     frame.pack(); 
    } 

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

例如JSpinner (editor is JFormattedTextField) with very simple DocumentFilter

+0

相當完整的答案+1 :) – Sage

+0

@mKorbel在這個解決方案中有一個奇怪的效果:在第4,第7,...數字之後添加了分隔符後,插入符號恰好被放錯了位置。如果輸入123123123,則輸入的結果是123 232 311,00(區域設置:ru)。不幸的是,這非常不方便,我想在某個地方有一個bug的實現? – user3021050

相關問題