0

コードのほんの一部です。クラスのプロジェクトで、摂氏、華氏、ケルビンをそれぞれの変更に基づいて変換する必要があります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);

    }
}
4

1 に答える 1

1

APropertyChangeEventは、新しい値がnot equals前の値に対するものである場合にのみ発生します。だから私はあなたcelToKelとに問題があると思いますfahToKel

たとえば、摂氏温度 C1 を華氏に変換し、再度摂氏に変換すると、C1 と等しくない C2 になります。

別の解決策は、値を設定する前にリスナーを削除し、後で再度追加することです。

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 に答える