Как изменить Thumb of JScrollbar на пользовательское изображение - PullRequest
2 голосов
/ 09 марта 2012

Скажем, у меня есть изображение подходящего размера внутри Image() Я хочу изменить Thumb или регулятор компонента 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);
        }
    }
}

Сейчас я не вижу большого пальца, а только трек, когда пытаюсь щелкнуть по полосе прокрутки.

Я проверил эту статью и увидел, что люди рекомендуют вам прочитать это , но он нигде не упоминает изображения, так что это то, что я придумал.

Надеюсь, кто-нибудь может мне помочь, спасибо!

Ответы [ 2 ]

0 голосов
/ 14 февраля 2014

Почему вы звоните g2g.dispose()?Он уничтожает графический объект, поэтому не может рисовать большой палец.Попробуйте удалить этот вызов внутри 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);
    }
0 голосов
/ 31 марта 2012

Проблема:

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

Вы должны использовать текущую позицию большого пальца в качестве начальной точки рисования. Я думаю, что это должны быть thumbRect.x и thumbRect.y, так что:

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

Кроме того, я не уверен в вашем вызове супер-метода в paintThumb. Разве эта строка не переопределит ваши индивидуальные вещи?

И: Зов распоряжения должен быть опущен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...