Я сделал небольшой диалог с 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 - это созданный мной класс, в котором хранится значение int , которое я получаю с помощью метода getIR (), и обновляю его с помощью метода setIR (int).
Я получаю исключение java.lang.ClassCastException: java.lang.Long не может быть приведен к java.lang.Float в строке Float newValue = (Float)resistorValue.getValue()*1000;
, а также в строке Float newValue = (Float)evt.getNewValue();