不知道如何在JFormattedTextField上修复我的PropertyChangeListener

编辑结束后

测试代码和输出

import java.awt.EventQueue; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.NumberFormat; import javax.swing.JFormattedTextField; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.text.NumberFormatter; public class Test{ private JFormattedTextField input, input2; private NumberFormatter formatter; private PropertyChangeListener listener; public Test(){ formatter = new NumberFormatter(NumberFormat.getNumberInstance()); input = new JFormattedTextField(formatter); input2 = new JFormattedTextField(formatter); listener = new PropertyChangeListener(){ @Override public void propertyChange(PropertyChangeEvent evt) { convert(evt); } }; input.setColumns(4); input2.setColumns(4); input.addPropertyChangeListener("value", listener); input2.addPropertyChangeListener("value", listener); input.setValue(0.0); JPanel panel = new JPanel(); panel.add(input); panel.add(input2); JOptionPane.showMessageDialog(null, panel); } private void convert(PropertyChangeEvent evt){ if (evt.getSource()== input){ if (evt.getSource()!= null){ double temp; temp = converter((Double)evt.getNewValue()); input2.setValue(temp); } } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable(){ public void run(){ new Test(); } }); } private double converter(double value){ value = value*2; return value; } } 

堆栈跟踪:

 Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double at test.Test.convert(Test.java:46) 

我的想法

因为我有一个传入double的方法(它的convert() ),并且貌似evt.getNewValue()返回直接值,在输入时技术上是一个long ,它会抛出该错误。

但是每次尝试将我的evt.getNewValue() parsing为double都没有用。 也许对我正在尝试用这个程序做些什么的一点知识会有所帮助。


该计划的用途

所以我有一个JPanel (在tabbedPane )有两个JFormattedTextField输入。 这是一个转换应用程序。 我的转换class method传入一个double并返回一个double 。 我希望将字段链接在一起,换句话说,只要一个字段的输入被更改,另一个字段的输入就会被更改(就像它是转换的输出一样)。

我正在考虑废弃PropertyChangListener并转而使用DocumentListener ,但选择先尝试前者,因为后者有3个可overrideable methods我必须要处理,其中一个可能会导致一些意外的结果(突出显示并删除该字段会触发例如两个events )。


TL; DR:

有没有更好的方法来获得动态更新的双输入字段应用程序? 在一个字段中输入一个数字,另一个字段的数字自动更新。

还是Java的新手。


EDIT1

我找到了一个临时解决方案:将DecimalFormat作为JFormattedTextField的格式。 但是,如果它没有小数也可以工作,我会喜欢它。

EDIT2

回答问题,没有意识到evt.getNewValue()正在返回一个Number实例。

你所知道的是, evt.getNewValue()返回的对象是一个Number对象。 如果您利用这些信息并尝试以下方面的内容,该怎么办:

 temp = ((Number)evt.getNewValue()).doubleValue();