[英]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.