【问题标题】:Java Slider - trigger fireStateChanged() without changing the value?Java Slider - 在不更改值的情况下触发 fireStateChanged()?
【发布时间】:2012-10-05 09:35:21
【问题描述】:

我在初始化滑块时使用了以下代码:

//Gets the corresponding slider value, from it's represented value. 
int curr = valueToSlider(min, max, current, scale, q, grains); 

final JSlider slider = new JSlider(JSlider.VERTICAL, 0, grains, curr);

slider.addChangeListener(new ChangeListener() {

  public void stateChanged(ChangeEvent event) {
    double value = sliderToValue(min, max, slider.getValue(), scale, q, grains); 
    String str = ""; 

    if (valueType == SliderValueType.FLOAT) 
       str = String.format("%.2f",value);
    if (valueType == SliderValueType.INTEGER) 
       str = String.format("%.0f", value); 

    valueLabel.setText(str); 
    callCommand(c, value);
  }
});

现在我需要触发 changed 事件以使 valueLabel 标签设置为正确的格式。

slider.setValue(curr); 

这不会触发 changed 事件,我猜是因为值没有改变。一个简单的 hacky 解决方法是执行以下操作:

slider.setValue(1);
slider.setValue(curr);

但您可以想象,在某些代码中,使用随机值触发更改的事件可能会产生不良后果。

我可以在我的初始化方法中重现 setText 方法。

if (valueType == SliderValueType.FLOAT) 
   str = String.format("%.2f",curr);

if (valueType == SliderValueType.INTEGER) 
   str = String.format("%.0f", curr); 

valueLabel.setText(str);

(老实说,这听起来像是最好的解决方案)。

但只是想知道 - 有没有办法以另一种方式触发更改的事件?

【问题讨论】:

    标签: java swing event-handling jslider changelistener


    【解决方案1】:

    stateChanged() 的内容重构为一个单独的方法,例如updateLabel()。从stateChanged() 方法和您的初始化代码中调用该方法。

    我同意,将值设置为任意值只是为了触发更改是错误的。

    注意:您可以通过 JSlider.fireStateChanged() 手动触发更改,但是对于未来的代码维护人员来说,这仍然比简单地调用 updateLabel() 不太清楚。

    【讨论】:

    • 称我为挑剔,但你不能像在 java 中那样直接在方法中创建方法。我可以做runnable trick。这会很有用 - 但看起来比 3 行重复代码更令人困惑。或者我可以在此方法之外创建一个私有方法,并传入标签和值,但我对此感到恶心 - 代码混乱?
    • @user1068446 谁说过方法中的方法?滑块值和标签文本之间的绑定(这基本上就是您正在做的事情)属于 somewhere - 只有在最简单的上下文中,该位置才能是单个侦听器(您的 ChangeListener),即使您的上下文也不是(你需要它两次)。因此,必须将它移到所有需要它的合作者都可以访问的地方,f.i.作为视图类的方法(对于简单的上下文)。下一步是提取某种具有值的业务模型,并将标签和滑块绑定到该值。
    • @mKorbel 谢谢,但是我需要添加一些代码 sn-ps ...目前没有吸引力:-)
    猜你喜欢
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 2016-10-13
    相关资源
    最近更新 更多