概要
JSlider
の数値テキストラベルの値を変更した場合、その位置やサイズが正しく描画されるように更新を行うメソッドを実行します。
Screenshot
Advertisement
サンプルコード
JSlider slider = new JSlider(0, 10000);
slider.putClientProperty("Slider.paintThumbArrowShape", Boolean.TRUE);
slider.setMajorTickSpacing(2500);
slider.setMinorTickSpacing(500);
slider.setPaintLabels(true);
slider.setPaintTicks(true);
slider.setSnapToTicks(true);
// slider.setBorder(BorderFactory.createLineBorder(Color.WHITE, 10));
Dictionary<?, ?> labelTable = slider.getLabelTable();
Collections.list(labelTable.keys()).stream()
.filter(Integer.class::isInstance)
.map(Integer.class::cast)
.forEach(i -> {
JLabel label = (JLabel) labelTable.get(i);
label.setText(Objects.toString(i / 100));
});
slider.setLabelTable(labelTable);
View in GitHub: Java, Kotlin解説
Default
- 最小
0
、最大10000
で作成したJSlider
のラベルをその1/100
で表示 - 各ラベルの文字数が変更されてもその幅が更新されないので目盛り中央に数字(文字列)が配置されない
NimbusLookAndFeel
などで最大値の100
が見切れて10
までしか表示されない
- 最小
JSlider#updateLabelUIs()
1/100
に変更後、JSlider#updateLabelUIs()
を実行してラベルを更新するJSlider#updateLabelUIs()
はprotected
なので内部でこれを呼び出しているJSlider#setLabelTable(...)
を実行するJSlider#updateUI()
内でもJSlider#updateLabelUIs()
を呼び出しているので、代わりにSwingUtilities.updateComponentTreeUI(slider);
を実行しても可
参考リンク
- java - JSlider is drawn incomplete, Working with Netbeans - Stack Overflow
- JSlider#updateLabelUIs() (Java Platform SE 8)