static JSlider onSliderValueChanged(JSlider slider, IVF1<Int> onChange) swing {
  slider.addChangeListener(new ChangeListener {
    int lastValue = slider.getValue();
    public void stateChanged(ChangeEvent e) {
      int value = slider.getValue();
      if (value != lastValue) {
        lastValue = value;
        setToolTip(slider, str(value));
        pcallF(onChange, value);
      }
    }
  });
  ret slider;
}

static JSlider onSliderValueChanged(JSlider slider, Runnable onChange) {
  if (onChange != null)
    onSliderValueChanged(slider, runnableToIVF1(onChange));
  ret slider;
}