2013-08-06 88 views
2

我有一個JFormattedTextField用戶將輸入價格,我有這個,但如果我鍵入一個字符,它會讓我無論如何。我需要這個文本字段只讀取數字,或者從鍵盤讀取數字,並忽略它是否是字符。我應該如何改變它才能使它工作?JFormattedTextField爲雙仍然需要字符

JFormattedTextField formattedTextField = new JFormattedTextField(); 
     formattedTextField.setBounds(25, 330, 56, 20); 
     contentPanel.add(formattedTextField); 
     formattedTextField.setValue(new Double(10.0)); 
+1

這個職位應該幫助ü:http://stackoverflow.com/questions/ 1313390/is-there-any-way-to-a-jtextfield中的任意數字值 –

回答

3

您需要設置格式化:

NumberFormat f = NumberFormat.getNumberInstance(); 
JFormattedTextField field = new JFormattedTextField(f); 

請看:
Format

NumberFormat

那就試試這個:

PlainDocument doc = new PlainDocument(); 
doc.setDocumentFilter(new DocumentFilter() { 
    @Override 
    public void insertString(FilterBypass fb, int off, String str, AttributeSet attr) 
     throws BadLocationException 
    { 
     fb.insertString(off, str.replaceAll("\\D++", ""), attr); // remove non-digits 
    } 
    @Override 
    public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr) 
     throws BadLocationException 
    { 
     fb.replace(off, len, str.replaceAll("\\D++", ""), attr); // remove non-digits 
    } 
}); 

JFormattedTextField field = new JFormattedTextField(); 
field.setDocument(doc); 
+0

仍然不適用於此 –

+0

爲什麼要將「DocumentFilter」與「JFormattedTextField '。在這種情況下,「JFormattedTextField」的附加值是多少? – Robin

+0

只是爲了象徵這個TextField得到了一個格式化的內容,但你是對的,JFormattedTextField的全部目的在這裏都沒有。 – Khinsu

0

A JFormattedTextField可以用於很多事情,它也可以用來過濾日期或電話號碼。您需要將NumberFormater設置爲TextField,或者使用DocumentFilter(僅與JTextField一起使用)。

入住此代碼段,這就是你如何只允許在JTextField中位數,使用的DocumentFilter,作爲最effeciive方式:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 
import javax.swing.text.DocumentFilter.FilterBypass; 

public class InputInteger 
{ 
    private JTextField tField; 
    private MyDocumentFilter documentFilter; 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Input Integer Example"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     contentPane.setBorder(
      BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     tField = new JTextField(10); 
     ((AbstractDocument)tField.getDocument()).setDocumentFilter(
       new MyDocumentFilter());   
     contentPane.add(tField); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     Runnable runnable = new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new InputInteger().displayGUI(); 
      } 
     }; 
     EventQueue.invokeLater(runnable); 
    } 
} 

class MyDocumentFilter extends DocumentFilter 
{ 
    @Override 
    public void insertString(DocumentFilter.FilterBypass fp 
      , int offset, String string, AttributeSet aset) 
           throws BadLocationException 
    { 
     int len = string.length(); 
     boolean isValidInteger = true; 

     for (int i = 0; i < len; i++) 
     { 
      if (!Character.isDigit(string.charAt(i))) 
      { 
       isValidInteger = false; 
       break; 
      } 
     } 
     if (isValidInteger) 
      super.insertString(fp, offset, string, aset); 
     else 
      Toolkit.getDefaultToolkit().beep(); 
    } 

    @Override 
    public void replace(DocumentFilter.FilterBypass fp, int offset 
        , int length, String string, AttributeSet aset) 
             throws BadLocationException 
    { 
     int len = string.length(); 
     boolean isValidInteger = true; 

     for (int i = 0; i < len; i++) 
     { 
      if (!Character.isDigit(string.charAt(i))) 
      { 
       isValidInteger = false; 
       break; 
      } 
     } 
     if (isValidInteger) 
      super.replace(fp, offset, length, string, aset); 
     else 
      Toolkit.getDefaultToolkit().beep(); 
    } 
}