Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java propertyChangeListeners连锁反应,导致溢出_Java_Swing_Joptionpane_Propertychangelistener - Fatal编程技术网

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