如何将JScrollbar的Thumb更改为自定义图像

时间:2012-03-09 06:05:24

标签: java swing scrollbar custom-component jscrollbar

假设我在Image()内有适当大小的图片 我想将JScrollBar组件的拇指或旋钮更改为此图像。

我知道我需要继承ScrollBarUI

这就是我现在所处的位置。

public class aScrollBar extends JScrollBar {

    public aScrollBar(Image img) {
        super();
        this.setUI(new ScrollBarCustomUI(img));
    }

    public class ScrollBarCustomUI extends BasicScrollBarUI {

        private final Image image;

        public ScrollBarCustomUI(Image img) {
            this.image = img;
        }

        @Override
        protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
            Graphics2D g2g = (Graphics2D) g;
            g2g.dispose();
            g2g.drawImage(image, 0, 0, null);
            super.paintThumb(g2g, c, thumbBounds);
        }

        @Override
        protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
            super.paintTrack(g, c, trackBounds);
        }


        @Override
        protected void setThumbBounds(int x, int y, int width, int height) {
            super.setThumbBounds(0, 0, 0, 0);
        }


        @Override
        protected Dimension getMinimumThumbSize() {
            return new Dimension(0, 0);
        }

        @Override
        protected Dimension getMaximumThumbSize() {
            return new Dimension(0, 0);
        }
    }
}

现在,当我尝试点击ScrollBar时,我看不到任何Thumb,只有一个Track。

我查看了this文章,看到有人建议您阅读this,但他没有提到图片,所以这就是我想出来的。

希望有人可以帮助我,谢谢!

2 个答案:

答案 0 :(得分:0)

问题是:

g2g.drawImage(image, 0, 0, null);

您必须使用当前拇指位置作为起始绘图点。我认为它必须是thumbRect.x和thumbRect.y,所以:

g2g.drawImage(image, thumbRect.x, thumbRect.y, null); should work.

另外,我不确定你是否在paintThumb中调用了super方法。那条线不会覆盖你定制的东西吗?

并且:应该废除处置召唤。

答案 1 :(得分:0)

你为什么打电话给g2g.dispose()?它会破坏Graphics对象,因此无法绘制拇指。尝试在paintThumb方法中删除此调用。以下是绘制自定义拇指的示例:

@Override
    protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
        if (thumbBounds.isEmpty() || !scrollbar.isEnabled()) {
            return;
        }
        g.translate(thumbBounds.x, thumbBounds.y);
        g.drawRect(0, 0, thumbBounds.width - 2, thumbBounds.height - 1);
        AffineTransform transform = AffineTransform.getScaleInstance((double) thumbBounds.width
                / thumbImg.getWidth(null), (double) thumbBounds.height / thumbImg.getHeight(null));
        ((Graphics2D) g).drawImage(thumbImg, transform, null);
        g.translate(-thumbBounds.x, -thumbBounds.y);
    }