概要

JSliderのノブの上部などに現在値を常時表示するよう設定します。

サンプルコード

// UIManager.put("Slider.paintValue", Boolean.TRUE)
JSlider slider = new JSlider();
slider.setPaintTrack(true);
slider.setPaintLabels(false);
slider.setPaintTicks(true);
slider.setMajorTickSpacing(10);
slider.setMinorTickSpacing(5);
UIDefaults d = UIManager.getLookAndFeelDefaults();
d.put("Slider.paintValue", Boolean.TRUE);
slider.putClientProperty("Nimbus.Overrides", d);
View in GitHub: Java, Kotlin

解説

  • Default
    • SynthLookAndFeelを継承するLookAndFeelSlider.paintValueJSliderの上部に現在値を表示可能
    • BasicLookAndFeelを継承するMetalLookAndFeelなどではSlider.paintValueの設定は無効でこの設定でのJSliderの現在値表示は不可能
    • 水平JSliderの場合はノブの上に動的に表示、垂直JSliderの場合はノブではなくトラックの上に固定で表示
    • Slider.paintValueGTKLookAndFeelでのデフォルトはtrueで現在値表示あり
    • Slider.paintValueNimbusLookAndFeelでのデフォルトはfalseで現在値表示なし
  • Slider.paintValue
    • Slider.paintValuetrueに設定したUIDefaultsJSlider#putClientProperty("Nimbus.Overrides", UIDefaults)で設定して現在値を表示
    • UIManager.put("Slider.paintValue", Boolean.TRUE)ですべてのJSliderの現在値表示を変更することも可能
    • Slider.paintValuetrueJSliderの現在値表示する場合、あとで親コンテナのレイアウトを再評価しないとJSliderのサイズが正しく描画されないバグ?がある
      • 上記のサンプルではEventQueue.invokeLater(...)を使用してあとでrevalidate()repaint()を実行して回避
  • Show ToolTip

参考リンク

コメント