如何用nimubs l&f填充jslider track直到当前thumb值?

mqkwyuun  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(426)

我正在处理一个音量滑块,并想改变默认的外观光轮 JSlider .
我想要我的 JSlider 自动填充轨迹直到当前拇指值。这种方法的一个想法是(见图)

我试着延长 BasicSliderUI 并覆盖 paintTrack() 没有运气的方法。我也试过剥皮 JSlider (参见示例)http://www.jasperpotts.com/blog/2008/08/skinning-a-slider-with-nimbus/)但这种方法似乎只是改变了 JSlider .
有人知道如何解决这个问题吗?

wqnecbli

wqnecbli1#

此示例仅支持水平 JSlider :

  1. import java.awt.*;
  2. import javax.swing.*;
  3. public class SliderSkinDemo2 {
  4. public JComponent makeUI() {
  5. UIDefaults d = new UIDefaults();
  6. d.put("Slider:SliderTrack[Enabled].backgroundPainter", new Painter<JSlider>() {
  7. @Override public void paint(Graphics2D g, JSlider c, int w, int h) {
  8. int arc = 10;
  9. int trackHeight = 8;
  10. int trackWidth = w - 2;
  11. int fillTop = 4;
  12. int fillLeft = 1;
  13. g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
  14. RenderingHints.VALUE_ANTIALIAS_ON);
  15. g.setStroke(new BasicStroke(1.5f));
  16. g.setColor(Color.GRAY);
  17. g.fillRoundRect(fillLeft, fillTop, trackWidth, trackHeight, arc, arc);
  18. int fillBottom = fillTop + trackHeight;
  19. int fillRight = xPositionForValue(
  20. c.getValue(), c,
  21. new Rectangle(fillLeft, fillTop, trackWidth, fillBottom - fillTop));
  22. g.setColor(Color.ORANGE);
  23. g.fillRect(fillLeft + 1, fillTop + 1, fillRight - fillLeft, fillBottom - fillTop);
  24. g.setColor(Color.WHITE);
  25. g.drawRoundRect(fillLeft, fillTop, trackWidth, trackHeight, arc, arc);
  26. }
  27. //@see javax/swing/plaf/basic/BasicSliderUI#xPositionForValue(int value)
  28. protected int xPositionForValue(int value, JSlider slider, Rectangle trackRect) {
  29. int min = slider.getMinimum();
  30. int max = slider.getMaximum();
  31. int trackLength = trackRect.width;
  32. double valueRange = (double) max - (double) min;
  33. double pixelsPerValue = (double) trackLength / valueRange;
  34. int trackLeft = trackRect.x;
  35. int trackRight = trackRect.x + (trackRect.width - 1);
  36. int xPosition;
  37. xPosition = trackLeft;
  38. xPosition += Math.round(pixelsPerValue * ((double) value - min));
  39. xPosition = Math.max(trackLeft, xPosition);
  40. xPosition = Math.min(trackRight, xPosition);
  41. return xPosition;
  42. }
  43. });
  44. JSlider slider = new JSlider();
  45. slider.putClientProperty("Nimbus.Overrides", d);
  46. JPanel p = new JPanel();
  47. p.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
  48. p.setBackground(Color.DARK_GRAY);
  49. p.add(new JSlider());
  50. p.add(Box.createRigidArea(new Dimension(200, 20)));
  51. p.add(slider);
  52. return p;
  53. }
  54. public static void main(String... args) {
  55. EventQueue.invokeLater(() -> {
  56. try {
  57. for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
  58. if ("Nimbus".equals(laf.getName())) {
  59. UIManager.setLookAndFeel(laf.getClassName());
  60. }
  61. }
  62. } catch (Exception e) {
  63. e.printStackTrace();
  64. }
  65. JFrame f = new JFrame();
  66. f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  67. f.getContentPane().add(new SliderSkinDemo2().makeUI());
  68. f.setSize(320, 240);
  69. f.setLocationRelativeTo(null);
  70. f.setVisible(true);
  71. });
  72. }
  73. }
展开查看全部

相关问题