gpt4 book ai didi

java - 使 JFormattedTextField 的行为类似于 ATM 输入

转载 作者:行者123 更新时间:2023-11-29 06:38:10 25 4
gpt4 key购买 nike

我想知道是否有办法让 JformattedTextField 或 jtextField 表现得像 atm 钱输入。我的意思是你从右到左输入,假设你输入 10,你需要再按 2 个 0,这样它就是 10.00 。当他从右向左打字时,程序会自动输入小数点?如果未输入 2 个 0,它将只是 .10 。这可能吗?如果我想使用该字符串进行计算,那将如何返回给我?我尝试了抽象格式化程序,但效果不是很好。我想用它来输入客户收到的金额。但是让它成为白痴证明。

最佳答案

这会强制用户始终从右侧输入文本,无论插入符号位于何处。插入新字符时,所有先前的字符都向左移动。将根据您的格式化程序应用格式:

import java.awt.*;
import java.text.*;
import javax.swing.*;
import javax.swing.text.*;

public class ABMTextField extends JTextField
{
private DecimalFormat format;
private String decimal;

public ABMTextField(DecimalFormat format)
{
this.format = format;

decimal = Character.toString( format.getDecimalFormatSymbols().getDecimalSeparator() );

setColumns( format.toPattern().length() );
setHorizontalAlignment(JFormattedTextField.TRAILING);

setText( format.format(0.0) );

AbstractDocument doc = (AbstractDocument)getDocument();
doc.setDocumentFilter( new ABMFilter() );
}

@Override
public void setText(String text)
{
Number number = format.parse(text, new ParsePosition(0));

if (number != null)
super.setText( text );
}

public class ABMFilter extends DocumentFilter
{
public void insertString(FilterBypass fb, int offs, String str, AttributeSet a)
throws BadLocationException
{
replace(fb, offs, 0, str, a);
}

public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
throws BadLocationException
{
if (".0123456789".contains(str))
{
Document doc = fb.getDocument();
StringBuilder sb = new StringBuilder( doc.getText(0, doc.getLength()) );

int decimalOffset = sb.indexOf( decimal );

if (decimalOffset != -1)
{
sb.deleteCharAt(decimalOffset);
sb.insert(decimalOffset + 1, decimal);
}

sb.append(str);

try
{
String text = format.format( format.parse( sb.toString() ) );
super.replace(fb, 0, doc.getLength(), text, a);
}
catch(ParseException e) {}
}
else
Toolkit.getDefaultToolkit().beep();
}

public void remove(DocumentFilter.FilterBypass fb, int offset, int length)
throws BadLocationException
{
Document doc = fb.getDocument();
StringBuilder sb = new StringBuilder( doc.getText(0, doc.getLength()) );

int decimalOffset = sb.indexOf( decimal );

if (decimalOffset != -1)
{
sb.deleteCharAt(decimalOffset);
sb.insert(decimalOffset - 1, decimal);
}

sb.deleteCharAt( sb.length() - 1) ;

try
{
String text = format.format( format.parse( sb.toString() ) );
super.replace(fb, 0, doc.getLength(), text, null);
}
catch(ParseException e) {}
}
}

private static void createAndShowUI()
{
DecimalFormat format = new DecimalFormat("###,##0.00");
ABMTextField abm = new ABMTextField( format );

JPanel panel = new JPanel();
panel.add( abm );

JFrame frame = new JFrame("ABMTextField");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( panel );
frame.setSize(200, 200);
frame.setLocationByPlatform( true );
frame.setVisible( true );
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}

How would that be returned to me if I want to use that string to do calculations on then?

您需要创建一个方法,可能是 getValue(),它会使用 format.parse(...) 方法返回一个实际数字。

关于java - 使 JFormattedTextField 的行为类似于 ATM 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17074758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com