• category: swing folder: SliderPaintValue title: JSliderの上部に現在値を常時表示する tags: [JSlider, LookAndFeel, SynthLookAndFeel, NimbusLookAndFeel, GTKLookAndFeel] author: aterai pubdate: 2021-09-27T00:10:53+09:00 description: JSliderのノブの上部などに現在値を常時表示するよう設定します。 image: https://drive.google.com/uc?id=1_If8hmAB7ec08-gyZvzCvFP5vEDfjGtT

概要

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

サンプルコード

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

参考リンク

コメント