如何解决如何从右到左制作 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 举报,一经查实,本站将立刻删除。