0

只是一段代码。为班级做一个项目,我必须根据对它们各自的更改来转换摄氏度、华氏度和开尔文JFormattedTextFields。问题是,当对listener摄氏温度的变化做出反应时,我的程序会改变华氏温度,然后它对我的华氏温度监听器做出反应,它再次对我的摄氏温度监听器做出反应,依此类推。由于这个问题,我还没有在我的 Kelvin 上工作过。我怀疑是否需要我的代码,因为这更像是一个概念问题,但无论如何:

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);

    }
}
4

1 回答 1

1

PropertyChangeEvent仅当新值not equals与前一个值相同时才会触发A。celToKel所以我想你的and有问题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);
于 2012-08-15T07:53:52.030 回答