netbeans 将jTextField的0s替换为I类型

2fjabf4q  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(132)

我希望jTextField包含12个0,我需要在键入时将这些0更改为数字。

  • 一开始是000000000000
  • 如果我输入123,则应该是000000000123

我在KeyPressed事件上执行了此操作,但它无法正常工作。

try {
        int i = Integer.parseInt(jTextField1.getText());
        jTextField1.setText(String.format("%012d", i));
    } catch (Exception e) {
        jTextField1.setText(String.format("%012d", 0));
    }
}

它会随着我的打字而变化,但很少有问题。
1.在我键入11个数字之前,它会一直更改,在我键入第12个数字后,它会删除所有数字,并再次显示为000000000005(如果我键入的第12个数字是5)
1.当我删除所有它只显示10个0而不是12,但当我再次键入一个数字它显示键入的数字和11个0.
有什么办法吗?

dtcbnfnu

dtcbnfnu1#

下面是一个自定义类,它尝试模拟银行机器的数据输入。也就是说,文本从右到左输入:

import java.awt.*;
import java.text.*;
import javax.swing.*;
import javax.swing.text.*;

public class ABMTextField extends JTextField
{
    private DecimalFormat format;
    private String decimal;

    public ABMTextField(DecimalFormat format)
    {
        this.format = format;

        decimal = Character.toString( format.getDecimalFormatSymbols().getDecimalSeparator() );

        setColumns( format.toPattern().length() );
        setHorizontalAlignment(JFormattedTextField.TRAILING);

        setText( format.format(0.0) );

        AbstractDocument doc = (AbstractDocument)getDocument();
        doc.setDocumentFilter( new ABMFilter() );
    }

    @Override
    public void setText(String text)
    {
        Number number = format.parse(text, new ParsePosition(0));

        if (number != null)
            super.setText( text );
    }

    public class ABMFilter extends DocumentFilter
    {
        public void insertString(FilterBypass fb, int offs, String str, AttributeSet a)
            throws BadLocationException
        {
            replace(fb, offs, 0, str, a);
        }

        public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
            throws BadLocationException
        {
            if (".0123456789".contains(str))
            {
                Document doc = fb.getDocument();
                StringBuilder sb = new StringBuilder( doc.getText(0, doc.getLength()) );

                int decimalOffset = sb.indexOf( decimal );

                if (decimalOffset != -1)
                {
                    sb.deleteCharAt(decimalOffset);
                    sb.insert(decimalOffset + 1, decimal);
                }

                sb.append(str);

                try
                {
                    String text = format.format( format.parse( sb.toString() ) );
                    super.replace(fb, 0, doc.getLength(), text, a);
                }
                catch(ParseException e) {}
            }
            else
                Toolkit.getDefaultToolkit().beep();
        }

        public void remove(DocumentFilter.FilterBypass fb, int offset, int length)
            throws BadLocationException
        {
            Document doc = fb.getDocument();
            StringBuilder sb = new StringBuilder( doc.getText(0, doc.getLength()) );

            int decimalOffset = sb.indexOf( decimal );

            if (decimalOffset != -1)
            {
                sb.deleteCharAt(decimalOffset);
                sb.insert(decimalOffset - 1, decimal);
            }

            sb.deleteCharAt( sb.length() - 1) ;

            try
            {
                String text = format.format( format.parse( sb.toString() ) );
                super.replace(fb, 0, doc.getLength(), text, null);
            }
            catch(ParseException e) {}
        }
    }

    private static void createAndShowUI()
    {
//      DecimalFormat format = new DecimalFormat("###,##0.00");
        DecimalFormat format = new DecimalFormat("0000000000");
        ABMTextField abm = new ABMTextField( format );

        JPanel panel = new JPanel();
        panel.add( abm );

        JFrame frame = new JFrame("ABMTextField");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( panel );
        frame.setSize(200, 200);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

您可以按如下方式更改默认掩码:

//DecimalFormat format = new DecimalFormat("###,##0.00");
DecimalFormat format = new DecimalFormat("0000000000");
p8ekf7hl

p8ekf7hl2#

String result = text.substring(1) + inputKey;

这将排除左边的字符并添加新的字符。

o7jaxewo

o7jaxewo3#

您的整数值可能已达到最大值,请尝试仅使用String。

try {
        String i = jTextField1.getText();
        String text = "";
        for (int j = 0; j < (12 - i.length()); j++) {
            text += "0";
        }
        jTextField1.setText(text + i);
    } catch (Exception e) {
        jTextField1.setText(String.format("%012d", 0));
    }

或者如果你想再短一点,你可以这样做。

try {
        String i = jTextField1.getText();
        String text = "000000000000";
        jTextField1.setText(text.substring(0, (12-i.length())) + i );
    } catch (Exception e) {
        jTextField1.setText(String.format("%012d", 0));
    }

它只是根据文本字段的长度,将一个由12个0组成的字符串进行子串化,然后将其添加到末尾。

相关问题