程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何从右到左制作 jtextfield 类型大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何从右到左制作 jtextfield 类型?

开发过程中遇到如何从右到左制作 jtextfield 类型的问题如何解决?下面主要结合日常开发的经验,给出你关于如何从右到左制作 jtextfield 类型的解决方法建议,希望对你解决如何从右到左制作 jtextfield 类型有所启发或帮助;

第一次在这里发帖,我希望我没有违反任何规则..好的,问题来了。

问题: 我想制作一个从右到左写入的 jtextfIEld,默认值为“0.00”,当用户从键盘输入一个数字时,它会从右边改变值,如果用户输入另一个数字,它会推送前一个输入并将新输入放在前一个输入的右侧。例如,如果用户在键盘上键入“1”,则 jtextfIEld 应显示为“0.01”,然后如果用户键入“5”,则 jtextfIEld 应显示为“0.15”,然后如果用户键入“0”,则jtextfIEld 应该显示为“1.50”等等..

问题说明: 问题是我的代码只能输入第一个数字,如果我输入更多数字,将不断更改第二个小数位数字。我正在使用 Eclipse IDE 并且也是 Java 新手,我提前道歉 因为我知识匮乏。无论如何,这是我的代码片段。

        txtp = new JTextFIEld();
        txtp.setText("0.00");
        String gp = txtp.getText();
        txtp.addKeyListener(new KeyAdapter() {
            @OverrIDe
            public voID keypressed(KeyEvent E) {
                String[] sn1 = {"1","2","3","4","5","6","7","8","9","0"};
                //String sn1 = String.valueOf(E);
                char C = e.getKeyChar();
                    if(Character.isDigit(C) ||Character.isISOControl(C)) {
                        txtp.setText("0.0");
                    }else {
                            txtp.setEditable(false);
                        }
                    /*if((gp=="0.0"+sn1&&(Character.isDigit(C) ||Character.isISOControl(C)))){
                        txtp.setText("0."+sn1);
                        //String gp = txtp.getText();
                    }else {
                        txtp.setEditable(false);
                    }
                    else if((gp=="0.0"+sn1) && (Character.isDigit(C) ||Character.isISOControl(C))) {
                        txtp.setText("0."+sn1);
                        if(Character.isDigit(C) ||Character.isISOControl(C)) {
                        txtp.setEditable(true);
                        }else{
                        txtp.setEditable(false);
                        }
                    }
                        else{
                        txtp.setEditable(false);
                        }   
                    switch (gp) {
                    case "":
                        txtp.setText("0.0");
                        if(Character.isDigit(C) ||Character.isISOControl(C)) {
                            txtp.setText("0.0");
                        }else{
                            txtp.setEditable(false);
                        }
                        break;
                    case "0.01":
                        txtp.setText("0.1");
                        if(Character.isDigit(C) ||Character.isISOControl(C)) {
                            txtp.setText("0.1");
                        }else{
                            txtp.setEditable(false);
                        }
                        break;
                        
                    }*/
                            
            }
        });

解决方法

我按照建议使用 DocumentFilter 做到了。我不得不让它一次只接收或删除一个字符。

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

public class TextFielding{

    static class EndFilter extends DocumentFilter{
      
        @Override
        public void insertString(DocumentFilter.FilterBypass fb,int offset,String String,AttributeSet attr) throws BadLOCATIOnException{
            replace(fb,offset,String,attr);
        }
        public void remove(DocumentFilter.FilterBypass fb,int length) throws BadLOCATIOnException{
            if(length > 1) return;
            
            Document d = fb.getDocument();
            int docLength = d.getLength();
            
            String left = docLength == 4 ? "0" : d.getText(0,docLength - 4);
            String shiftl = d.getText(docLength -4,1);
            String shiftr = d.getText(docLength - 2,1);
            String result = left + "." + shiftl + shiftr;
            super.replace(fb,docLength,result,null);
            
        }
        
        @Override
        public void replace(DocumentFilter.FilterBypass fb,int length,String text,AttributeSet attrs) throws BadLOCATIOnException{
            if(length > 0 || text.length() != 1 || !Character.isDigit( text.charAt(0) ) ){
                return;
            }
            
            Document d = fb.getDocument();
            int docLength = d.getLength();
            
            //build the String.
            String left = d.getText( 0,docLength - 3);
            if( left.equals("0") ) left = "";
            String crossing = d.getText( docLength - 2,1);
            String shift = d.getText( docLength -1,1);
            String result = left + crossing + "." + shift + text;
            super.replace(fb,attrs);
        }
    
    }

    public static void main(String[] args){
        JFrame frame = new JFrame("text field");
        JTextField field = new JTextField(10);
        
        field.setHorizontalAlignment( JTextField.RIGHT );
        field.setText("0.00");
        ((AbstractDocument)field.getDocument()).setDocumentFilter(new EndFilter());
        
        frame.add(field);
        
        
        
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

我假设如果输入的数字超过 3 个,那么它应该始终保留 2 个小数位。

当删除一个字符时,它会将所有字符向右移动小数点。如果左边最后一个字符为空,则移入一个 0。

输入字符时必须是一个字符,不能替换任何字符,必须是数字。然后将其附加在右侧,将所有字符通过小数点向左移动。

这应该作为模板,因为如果它不纠正猜测格式,它会显示如何接收输入,修改它并修改相应的文档。

大佬总结

以上是大佬教程为你收集整理的如何从右到左制作 jtextfield 类型全部内容,希望文章能够帮你解决如何从右到左制作 jtextfield 类型所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。