2013-08-06 30 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(); 
    } 
}