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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章