货币格式化程序不是用户友好/直观的。随机增加输入字段
Posted
技术标签:
【中文标题】货币格式化程序不是用户友好/直观的。随机增加输入字段【英文标题】:Currency Formatter not being user friendly/intuitive. Randomly increases the input field 【发布时间】:2014-03-17 04:12:10 【问题描述】:我有一个JTextField
,我用NumberFormatter
格式化。它工作得非常好,直到我尝试添加一个零,然后它将字段增加到 10,000 x 旧输入。这不是世界上最大的交易,只是试图以用户身份修复输入有点令人困惑。
已修复
如下所述,删除 setMaximumuFraction()
/setMinimumFraction()
以及 setOverwriteMode()
使其像我希望的那样工作。
private void setValues()
name = new JFormattedTextField();
format = NumberFormat.getCurrencyInstance(Locale.US);
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
formatter = new NumberFormatter(format);
formatter.setMinimum(0.0);
formatter.setMaximum(10000000.0);
formatter.setAllowsInvalid(false);
formatter.setOverwriteMode(true);
price = new JFormattedTextField(formatter);
price.setValue(0.0);
这是我当前的代码,我用
声明变量private JFormattedTextField name, price;
private NumberFormat format;
private NumberFormatter formatter;
也许是因为我将 setMinimumFractionDigits()
设置为 2 或其他什么。
有什么想法吗?
编辑
这是工作代码的示例。只需要自己编译:
import java.awt.EventQueue;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.NumberFormatter;
public class testClass extends JPanel
private JFormattedTextField name, price;
private int option;
private NumberFormat format;
private NumberFormatter formatter;
public testClass()
initComponents();
startPanel();
private void initComponents()
name = new JFormattedTextField();
format = NumberFormat.getCurrencyInstance(Locale.US);
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
formatter = new NumberFormatter(format);
formatter.setMinimum(0.0);
formatter.setMaximum(10000000.0);
formatter.setAllowsInvalid(false);
formatter.setOverwriteMode(true);
price = new JFormattedTextField(formatter);
price.setValue(0.0);
private void startPanel()
Object[] message =
"Item Name", name,
"Item Price", price,
;
option = JOptionPane.showConfirmDialog(this, message, "New Customer Information", JOptionPane.OK_CANCEL_OPTION);
public static void main (String[] args)
try
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels())
if ("Nimbus".equals(info.getName()))
UIManager.setLookAndFeel(info.getClassName());
break;
catch (ClassNotFoundException ex)
Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
catch (InstantiationException ex)
Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
catch (IllegalAccessException ex)
Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
catch (UnsupportedLookAndFeelException ex)
Logger.getLogger(testClass.class.getName()).log(Level.SEVERE, null, ex);
EventQueue.invokeLater(new Runnable()
public void run()
new testClass().setVisible(true);
);
【问题讨论】:
"It works perfectly fine until I try adding a zero, then it increases the field to something like 10,000 x the old input."
-- 请澄清这一点。还可以考虑创建和发布minimal example program。
@HovercraftFullOfEels 当然,我会建立一个快速程序。我的意思是因为它是NumberFormatter
,它会主动更改输入字段,所以当我输入两个以上的数字时,它会从$0.00
变为$1,500.00
或类似的东西。因为它随机添加零。
【参考方案1】:
我认为这可以通过不将格式化程序的覆盖模式设置为 true 来解决。这些家伙也不应该是必需的:
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
因为 Locale.US 货币格式应该已经处理了这一点。
编辑:这是我用来测试您的代码的最小示例程序:
import java.text.NumberFormat;
import java.util.Locale;
import javax.swing.*;
import javax.swing.text.NumberFormatter;
public class TestList
static JFormattedTextField price;
static NumberFormat format;
static NumberFormatter formatter;
public static void main(String[] args)
setValues();
JPanel panel = new JPanel();
panel.add(new JLabel("price:"));
panel.add(price);
JOptionPane.showMessageDialog(null, panel);
private static void setValues()
format = NumberFormat.getCurrencyInstance(Locale.US);
// format.setMinimumFractionDigits(2);
// format.setMaximumFractionDigits(2);
formatter = new NumberFormatter(format);
formatter.setMinimum(0.0);
formatter.setMaximum(10000000.0);
formatter.setAllowsInvalid(false);
// formatter.setOverwriteMode(true);
price = new JFormattedTextField(formatter);
price.setColumns(10);
price.setValue(0.0);
请注意,我删除了 name 字段,因为它与您的问题完全无关,并将所有内容设为静态,以便它可以在简单的静态 main 方法中运行。
【讨论】:
我现在试试这个 EDIT 好吧,谢谢它现在可以工作了。以上是关于货币格式化程序不是用户友好/直观的。随机增加输入字段的主要内容,如果未能解决你的问题,请参考以下文章