Double的JFormattedTextField仍然需要字符[重复]

Posted

技术标签:

【中文标题】Double的JFormattedTextField仍然需要字符[重复]【英文标题】:JFormattedTextField for Double still takes characters [duplicate] 【发布时间】:2013-08-07 20:15:01 【问题描述】:

我有一个 JFormattedTextField,用户可以在其中输入价格,我有这个,但如果我输入一个字符,它无论如何都会让我输入。我需要此文本字段仅从键盘读取数字或 , 如果它是字符则忽略。我应该如何更改它才能使其正常工作?

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

【问题讨论】:

这篇文章应该对你有帮助:***.com/questions/1313390/… 【参考方案1】:

你需要设置一个Formatter:

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);

【讨论】:

还是不行 为什么要将DocumentFilterJFormattedTextField 结合使用。在这种情况下JFormattedTextField 的附加值是多少? 只是为了表明这个 TextField 有一个格式化的内容,但你是对的,这里错过了 JFormattedTextField 的全部目的。【参考方案2】:

JFormattedTextField 可用于多种用途,也可用于过滤日期或电话号码。您要么需要将 NumberFormater 设置为 TextField,要么使用 DocumentFilter(也仅适用于 JTextField)。

检查此代码 sn-p,这就是您使用 DocumentFilter 仅允许 JTextField 中的数字作为最有效的方式:

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();
    

【讨论】:

以上是关于Double的JFormattedTextField仍然需要字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java里double类和double的区分 是否在于一个是大写一个是小写?

关于double和float的包装类Double和Float代码如下 Double d1 = 1.0;Double d2 = 1.0;

C#:double[][] 和 double[,] [重复]

double 比较大小

如何在 Scala 中将 Array[(Double, Double)] 转换为 Array[Double]?

允许将 (double *) 转换为 (double **) 吗?