Java 将jTextField的0替换为I类型

Java 将jTextField的0替换为I类型,java,netbeans,jtextfield,Java,Netbeans,Jtextfield,我希望jTextField具有120,我需要将这些0更改为我键入时键入的数字 开始时有000000000000 如果我输入123,那么它应该是000000000123 我在按下键的事件中执行了此操作,但它无法正常工作 try { int i = Integer.parseInt(jTextField1.getText()); jTextField1.setText(String.format("%012d", i)); } catch (Excep

我希望jTextField具有120,我需要将这些0更改为我键入时键入的数字

  • 开始时有000000000000
  • 如果我输入123,那么它应该是000000000123
我在按下
键的事件中执行了此操作,但它无法正常工作

  try {
        int i = Integer.parseInt(jTextField1.getText());
        jTextField1.setText(String.format("%012d", i));
    } catch (Exception e) {
        jTextField1.setText(String.format("%012d", 0));
    }
}             
它会随着我的输入而改变,但几乎没有问题

  • 它会一直更改,直到我键入11个数字,在我键入第12个数字之后,它会删除所有数字,并再次显示为000000000005(如果我键入的第12个数字是5)
  • 当我全部删除时,它只显示10秒而不是12秒,但当我再次键入数字时,它显示键入的数字和11秒 有什么解决办法吗

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

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

    您的整数值可能已达到最大值,请尝试仅使用字符串

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

    它只是根据文本字段的长度将12个0的字符串作为子字符串,然后将其添加到末尾。

    这里有一个自定义类,它尝试模拟银行机器的数据输入。即从右向左输入文本:

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

    你说它工作不正常是什么意思。
    工作不正常。
    你面临的问题是什么?我刚才在quection上添加了这些问题。Sorry这将旋转输出值,始终保留text.length并删除左侧字符。它仅为1个文本字段,而不是2个。我第一次在这里输入代码时出错了。我为您修复了它。它只更改了第12个字符。其余的0到0。如果我键入1,2,3,它将显示000000000003
    //DecimalFormat format = new DecimalFormat("###,##0.00");
    DecimalFormat format = new DecimalFormat("0000000000");