有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java propertyChangeListeners连锁反应,导致溢出

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

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

    }
}

共 (1) 个答案

  1. # 1 楼答案

    只有当新值与前一个值相比PropertyChangeEvent时,才会触发not equals。所以我想你的celToKelfahToKel有问题

    例如,将摄氏温度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);