Java:如何使JSpinner显示带有一定偏移量的值

4

在我的应用程序中,一些值的内部范围从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,递增更多,触发事件,递增等等。 如何解决这个问题?谢谢。

2个回答

4
不要混淆程序的数据模型和旋转器的数字模型,保持它们分开。委托给一个私有的SpinnerNumberModel,具有正确的呈现范围,1..n。提供一个访问器,在所需范围内返回值,0..n–1。
提供方法getAdjustedValue(),所有客户端都应该使用它来代替getValue()
是的。SpinnerModel服务于JSpinner视图。如果您的应用程序模型使用不同的单位,则必须进行一些转换。您必须决定在哪里最合适。作为一个具体的例子,这个模型ControlPanel有一个旋转器,调整Hz中的频率,而应用程序的Timer需要以毫秒为单位的周期。

那么,如果存在偏移量,JSpinner会将 value+offset 传递给 SpinnerNumberModel,并提供 getAdjustedValue 方法,其基本上是 getValue()-offset,所有客户端都应该使用该方法而不是 getValue?我理解的对吗? - Boris Mikhaylov

2

你能详细说明一下吗?我不明白它如何有帮助。 - Boris Mikhaylov
@Boris Mikhaylov 如果出现“进入无限循环”的情况,那么你可以将其限制在某个范围内。 - mKorbel
+1 这是一个很好的私有SpinnerModel示例,正如这里所建议的。 - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接