微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从右到左制作 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。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?