protected void installDefaults() {
    super.installDefaults();

    scrollBarWidth = UIManager.getInt("ScrollBar.width");
    incrGap = UIManager.getInt("ScrollBar.incrementButtonGap");
    decrGap = UIManager.getInt("ScrollBar.decrementButtonGap");

    // TODO this can be removed when incrGap/decrGap become protected
    // handle scaling for sizeVarients for special case components. The
    // key "JComponent.sizeVariant" scales for large/small/mini
    // components are based on Apples LAF
    String scaleKey = (String) scrollbar.getClientProperty("JComponent.sizeVariant");
    if (scaleKey != null) {
      if ("large".equals(scaleKey)) {
        scrollBarWidth *= 1.15;
        incrGap *= 1.15;
        decrGap *= 1.15;
      } else if ("small".equals(scaleKey)) {
        scrollBarWidth *= 0.857;
        incrGap *= 0.857;
        decrGap *= 0.857;
      } else if ("mini".equals(scaleKey)) {
        scrollBarWidth *= 0.714;
        incrGap *= 0.714;
        decrGap *= 0.714;
      }
    }
  }
 /** Installs the defaults. */
 protected void installDefaults() {
   // need to initialise isFreeStanding before calling the super class,
   // so that the value is set when createIncreaseButton() and
   // createDecreaseButton() are called (unless there is somewhere earlier
   // that we can do this).
   Boolean prop = (Boolean) scrollbar.getClientProperty(FREE_STANDING_PROP);
   isFreeStanding = prop == null ? true : prop.booleanValue();
   scrollBarShadowColor = UIManager.getColor("ScrollBar.shadow");
   super.installDefaults();
 }
  // 重绘滚动条的滑块
  public void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
    super.paintThumb(g, c, thumbBounds);
    int tw = thumbBounds.width;
    int th = thumbBounds.height;
    // 重定图形上下文的原点,这句一定要写,不然会出现拖动滑块时滑块不动的现象
    g.translate(thumbBounds.x, thumbBounds.y);

    Graphics2D g2 = (Graphics2D) g;
    GradientPaint gp = null;
    if (this.scrollbar.getOrientation() == JScrollBar.VERTICAL) {
      gp = new GradientPaint(0, 0, new Color(204, 204, 204), tw, 0, new Color(204, 204, 204));
    }
    if (this.scrollbar.getOrientation() == JScrollBar.HORIZONTAL) {
      gp = new GradientPaint(0, 0, new Color(204, 204, 204), 0, th, new Color(204, 204, 204));
    }
    g2.setPaint(gp);
    g2.fillRoundRect(0, 0, (tw - 1), (th - 1), 5, 5);
    // 边框颜色
    g2.setColor(thumbBorderColor);
    g2.drawRoundRect(0, 0, (tw - 1), (th - 1), 5, 5);
  }
  protected void layoutHScrollbar(JScrollBar sb) {
    if (AbstractLookAndFeel.getTheme().isLinuxStyleScrollBarOn()) {
      Dimension sbSize = sb.getSize();
      Insets sbInsets = sb.getInsets();
      int sizeW = sbSize.width - sbInsets.left - sbInsets.right;

      /*
       * Height and top edge of the buttons and thumb.
       */
      int itemY = sbInsets.top;
      int itemH = sbSize.height - (sbInsets.top + sbInsets.bottom); // Math.min(itemW, sizeH / 2);
      int itemW = Math.min(itemH, sizeW / 2); // sbSize.width - (sbInsets.left + sbInsets.right);

      /* Nominal locations of the buttons, assuming their preferred
       * size will fit.
       */
      int decrButtonX = sbSize.width - sbInsets.right - itemW - itemW + 1;
      int incrButtonX = sbSize.width - sbInsets.right - itemW;

      /* Compute the width and origin of the thumb. The case
       * where the thumb is at the right edge is handled specially
       * to avoid numerical problems in computing thumbX.  Enforce
       * the thumbs min/max dimensions. If the thumb doesn't
       * fit in the track (trackW) we'll hide it later.
       */
      float trackW = sbSize.width - sbInsets.left - sbInsets.right - itemH - itemH + 1;
      float min = sb.getMinimum();
      float max = sb.getMaximum();
      float extent = sb.getVisibleAmount();
      float range = max - min;
      float value = sb.getValue();

      int maxThumbW = getMaximumThumbSize().width;
      int minThumbW = getMinimumThumbSize().width;
      int thumbW = (range <= 0) ? maxThumbW : (int) (trackW * (extent / range));
      thumbW = Math.max(thumbW, minThumbW);
      thumbW = Math.min(thumbW, maxThumbW);

      int thumbX = decrButtonX - thumbW;
      if (value < (max - extent)) {
        float thumbRange = trackW - thumbW;
        thumbX = (int) (0.5f + (thumbRange * ((value - min) / (range - extent))));
      }

      /* If the thumb isn't going to fit, zero it's bounds.  Otherwise
       * make sure it fits between the buttons.  Note that setting the
       * thumbs bounds will cause a repaint.
       */
      if (thumbW > trackW) {
        setThumbBounds(0, 0, 0, 0);
      } else {
        setThumbBounds(thumbX, itemY, thumbW, itemH);
      }
      decrButton.setBounds(decrButtonX, itemY, itemW, itemH);
      incrButton.setBounds(incrButtonX, itemY, itemW, itemH);

      /* Update the trackRect field.
       */
      trackRect.setBounds(0, itemY, (int) trackW, itemH);

    } else {
      super.layoutHScrollbar(sb);
    }
  }
 protected void layoutVScrollbar(JScrollBar sb) {
   if (useAlternateLayout) alternateLayoutVScrollbar(sb);
   else super.layoutVScrollbar(sb);
 }
 public void setThumbBounds(int x, int y, int w, int h) {
   super.setThumbBounds(x, y, w, h);
 }
 // 设置滑块bounds
 @Override
 protected void setThumbBounds(int x, int y, int width, int height) {
   super.setThumbBounds(x + width / 4, y, width / 2, height);
 }
 /*
  * @see javax.swing.plaf.basic.BasicScrollBarUI#paint(java.awt.Graphics,
  * javax.swing.JComponent)
  */
 @Override
 public void paint(Graphics g, JComponent c) {
   super.paint(g, c);
 }