Java propertyChangeListeners连锁反应,导致溢出
只是一段代码。在课堂上做一个项目,我必须根据对各自Java propertyChangeListeners连锁反应,导致溢出,java,swing,joptionpane,propertychangelistener,Java,Swing,Joptionpane,Propertychangelistener,只是一段代码。在课堂上做一个项目,我必须根据对各自JFormattedTextFields的更改来转换摄氏度、华氏度和开尔文。问题是当监听器对摄氏度的变化作出反应时,我的程序会改变华氏度,然后华氏度监听器会对我的华氏度监听器作出反应,而华氏度监听器会再次对我的摄氏度监听器作出反应,依此类推。由于这个问题,我还没有使用开尔文的东西。我怀疑是否需要我的代码,因为这更像是一个概念性问题,但无论如何,这就是: private class ValueChangeHandler implements Pro
JFormattedTextFields
的更改来转换摄氏度、华氏度和开尔文。问题是当监听器
对摄氏度的变化作出反应时,我的程序会改变华氏度,然后华氏度监听器会对我的华氏度监听器作出反应,而华氏度监听器会再次对我的摄氏度监听器作出反应,依此类推。由于这个问题,我还没有使用开尔文的东西。我怀疑是否需要我的代码,因为这更像是一个概念性问题,但无论如何,这就是:
private class ValueChangeHandler implements PropertyChangeListener
{
public void propertyChange(PropertyChangeEvent event)
{
Object celsiusChange = event.getSource();
Object fahrenheitChange = event.getSource();
Object kelvinChange = event.getSource();
if(celsiusChange == celsiusField)
{
tempCelsius = (Double)celsiusField.getValue();
tempFahrenheit = celToFah(tempCelsius);
tempKelvin = celToKel(tempCelsius);
fahrenheitField.setValue(tempFahrenheit);
kelvinField.setValue(tempKelvin);
}
else if(fahrenheitChange == fahrenheitField)
{
tempFahrenheit = (Double)fahrenheitField.getValue();
tempCelsius = fahToCel(tempFahrenheit);
tempKelvin = fahToKel(tempFahrenheit);
celsiusField.setValue(tempCelsius);
kelvinField.setValue(tempKelvin);
}
}
只有当新值
不等于上一个值时,PropertyChangeEvent
才会触发。所以我想你的celToKel
和fahToKel
有问题
例如,将摄氏温度C1换算成华氏温度,再换算成塞利乌斯温度,得到的C2不等于C1
另一个解决方案是在设置值之前删除侦听器,然后再添加它
public class ValueChangeHandler implements PropertyChangeListener
{
@Override
public void propertyChange(final PropertyChangeEvent event)
{
...
fahrenheitField.removePropertyChangeListener("value", this);
fahrenheitField.setValue(tempFahrenheit);
fahrenheitField.addPropertyChangeListener("value", this);
...
}
}
还检查侦听器是否仅绑定到value属性
fahrenheitField.addPropertyChangeListener("value", this);
而不是所有的属性
fahrenheitField.addPropertyChangeListener(this);
请编辑您的问题,以包含一个显示您描述的问题的列表。这里是一个工作的起点。另请参见此,它使用了ActionListener
。