簡體   English   中英

如何從右到左制作jtextfield類型

[英]How to make a jtextfield type from right to left

第一次在這里發帖,我希望我沒有違反任何規則.. 好的,問題來了。

問題:我想創建一個從右到左書寫的 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, 0, string, attr);
        }
        public void remove(DocumentFilter.FilterBypass fb, int offset, 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, 0, docLength, result, null);
            
        }
        
        @Override
        public void replace(DocumentFilter.FilterBypass fb, int offset, 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, 0, docLength, result, 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。

鍵入字符時,它必須是一個字符,並且不能替換任何字符,並且必須是數字。 然后將其附加在右側,將所有字符向左移過小數點。

這應該作為一個模板,因為如果它不糾正猜測格式,它會顯示如何接收輸入、修改它並修改相應的文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM