2

コンポーネント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);
        }
    }
}

現在、Thumbは表示されていません。スクロールバーをクリックしようとすると、トラックのみが表示されます。

私はこの記事をチェックして、人々がこれを読むことを勧めているのを見ましたが、彼はどこにも画像について言及していないので、これが私が思いついたものです。

誰かが私を助けてくれることを願っています、ありがとう!

4

2 に答える 2

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);
    }
于 2014-02-13T21:36:22.770 に答える
0

問題は:

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

現在の親指の位置を描画開始点として使用する必要があります。私はそれがthumbRect.xとthumbRect.yでなければならないと思うので:

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

さらに、ペイントサムでのスーパーメソッドの呼び出しについてはわかりません。その行はカスタマイズされたものを上書きしませんか?

And: dispose の呼び出しは省略してください。

于 2012-03-30T23:01:25.930 に答える