JFormattedTextField 和 NumberFormat 与 Float 一起使用

Posted

技术标签:

【中文标题】JFormattedTextField 和 NumberFormat 与 Float 一起使用【英文标题】:JFormattedTextField and NumberFormat to work with Float 【发布时间】:2011-11-24 08:32:55 【问题描述】:

我用 JFormattedTextField 做了一个小对话框,输入一个介于 0 和 10 之间的浮点数,最多 3 个十进制数。为此,我使用 NumberFormat 和 PropertyChangeListener 来验证值或返回旧值。但它不起作用:

public class IRCompensationDialog extends JDialog

private static final long serialVersionUID = 1L;

private JDialog irDialog;
private JButton cancelButton, okButton;
private JFormattedTextField resistorValue;
private INode nodo;

public IRCompensationDialog(int idNodo) throws BusinessException, ParseException
    super(MainFrame.getInstance());
    this.irDialog = this;
    this.setResizable(false);
    this.setModal(true);
    this.setTitle("IR Compensation");
    this.nodo = new ServicesFactoryImpl().getNodesServices().getNode(idNodo);

    initComponents();

    this.pack();
    this.setLocationRelativeTo(null);
    this.setVisible(true);


private void initComponents() throws ParseException
    NumberFormat numberFormat = NumberFormat.getInstance();
    numberFormat.setMaximumFractionDigits(3);
    resistorValue = new JFormattedTextField(numberFormat);
    resistorValue.addPropertyChangeListener("value", new IRValueChangeListener());
    float currentValue = nodo.getIR() / 1000;
    resistorValue.setValue(currentValue);

    JPanel botonera = new JPanel();
    cancelButton = new JButton("Cancel");
    cancelButton.addActionListener(new ActionListener() 
        @Override
        public void actionPerformed(ActionEvent e) 
            irDialog.setVisible(false);
        
    );
    botonera.add(cancelButton);
    okButton = new JButton("OK");
    okButton.addActionListener(new ActionListener() 
        @Override
        public void actionPerformed(ActionEvent e) 
            Float newValue = (Float)resistorValue.getValue()*1000;
            nodo.setIR(newValue.intValue());
        
    );
    botonera.add(okButton);

    this.setLayout (new BorderLayout());
    this.add (resistorValue, BorderLayout.CENTER);
    this.add (new JLabel("Enter resistor value (Ohms):"), BorderLayout.NORTH);
    this.add (botonera, BorderLayout.SOUTH);


private class IRValueChangeListener implements PropertyChangeListener

    @Override
    public void propertyChange(PropertyChangeEvent evt) 
        JFormattedTextField field = (JFormattedTextField) evt.getSource();
        Float newValue = (Float)evt.getNewValue().toString();

        if(newValue>0 && newValue<=10000)
            JOptionPane.showMessageDialog(MainFrame.getInstance(), " Value must be between 0 and 10 Ohm", "Error", JOptionPane.ERROR_MESSAGE);
            Float oldValue = (Float) evt.getOldValue();
            field.setValue(oldValue);
        

    


INode 是我创建的一个类,它存储了我使用 getIR() 方法获得的 int 值,并使用 setIR(int) 方法对其进行更新。

我得到 java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Float in line Float newValue = (Float)resistorValue.getValue()*1000; 和 line Float newValue = (Float)evt.getNewValue();

【问题讨论】:

【参考方案1】:

有两个区域

1) 不是Float,而是float

2) 我使用强制转换从 JFormattedTextField 获取价值

3)float newValue = (((Number) resistorValue.getValue()).floatValue());

【讨论】:

以上是关于JFormattedTextField 和 NumberFormat 与 Float 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

JFormattedTextField 格式化百分比数字?

JFormattedTextField 仅返回默认值

如何从 JformattedTextfield 检索货币格式值

JFormattedTextField 接受不同的位数

具有任意小数位数的 JFormattedTextfield

为 JFormattedTextField 分配一个浮点数