Java:いくつかのオフセットを使ってJSpinnerの値を表示する方法

私のアプリケーションでは、内部的に値の範囲が0になっていますが、ユーザーは1から始まるこの範囲を参照する必要があります。このオフセットの要素をプレゼンテーションに移動することが適切であると考えました。この場合、JSpinnerコンポーネントです。オフセットがある場合はコンストラクタで指定することができます(すべての値にそのオフセットがあるわけではありません)。しかし、モデルのJSpinnerまたは getValue()getValue()をそのようなものにオーバーライドすると(+1はテスト用です)

       public Object getValue() {
            Number value = (Number)super.getValue();
            Number newValue=value;
            if (value instanceof Double){
                newValue=value.doubleValue()+1;
            }
            else if (value instanceof Integer){
                newValue = value.intValue()+1;
            }
            return newValue;
        }

それは無限ループに入ります。私は、ここで何らかの理由で国家変更イベントが発生すると思う。 getValue をもう一度呼び出し、さらに増分し、イベントを発生させ、増分などを行います。 どのようにこれを解決することができますか?ありがとう

4

2 答え

あなたのプログラムのデータモデルとスピナーのナンバーモデルを混同しないでください。それらを分離してください。正しい提示範囲、1 .. n を持つプライベートな SpinnerNumberModel に委任します。目的の範囲0 .. n -1の値を返すアクセサを提供します。

getValue()の代わりにすべてのクライアントが使用する必要がある getValue() - offset のメソッド getAdjustedValue() ?

はい。 SpinnerModelJSpinner ビューを提供します。アプリケーションのモデルで異なる単位が使用されている場合、変換が行われる必要があります。あなたはそれが最も理にかなっている場所を決めなければならないでしょう。具体的な例として、このモデルControlPanel には、周波数を Hz アプリケーションの Timer にはミリ秒単位のピリオドが必要です。

4
追加された
私は上で詳述しました。
追加された 著者 trashgod,
したがって、オフセットがある場合、JSpinnerは value + offsetSpinnerNumberModel に渡し、基本的に getValue() - getAdjustedValue すべてのクライアントが getValue の代わりに使用するオフセット?あなたは正しいことを理解しましたか?
追加された 著者 Boris Mikhaylov,
ありがとう、それは正しい道のりで私を得た
追加された 著者 Boris Mikhaylov,

私は、 CyclingSpinnerListModel は次のことができると思います。それを行う

2
追加された
@Boris Mikhaylovが無限ループに入るについては、それをいくつかの範囲に収めることができます
追加された 著者 mKorbel,
+1これはプライベートな SpinnerModel の良い例です。ここをクリックしてください。
追加された 著者 trashgod,
あなたはそれを詳しく説明できますか?私はそれがどのように役立つかわかりません
追加された 著者 Boris Mikhaylov,
全体のポイントは値を1回増やすことです
追加された 著者 Boris Mikhaylov,