2010-05-19 61 views
1

我想更改JScrollBar的外觀。
我這樣做覆蓋/擴展ScrollBarUI。
通過覆蓋createIncreaseButtoncreateDecreaseButton來改變箭頭按鈕的外觀是沒有問題的。 我通過覆蓋paintThumb和paintTrack方法來改變軌道的寬度。自定義JScrollbar問題(更改旋鈕/拇指)

它現在看起來像<----o---->(非常薄的軌跡線和一個橢圓形的拇指/旋鈕)。
問題:
旋鈕不能移動,直到盡頭:
它是什麼樣子:    <---o------>
它應該是什麼樣子:<---------o>

我知道這是因爲我做了橢圓不伸展(原始矩形與寬度一起伸展)。
我完全無法改變拇指移動的計算,所以它可以移動到最後。

我會非常感謝幫助。

繼承人的代碼:

public class TestScrollBarMain extends JFrame { 

public TestScrollBarMain() { 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    JPanel p = new JPanel(); 
    p.setPreferredSize(new Dimension(500, 500)); 
    JScrollPane s = new JScrollPane(p); 
    MyScrollBar b = new MyScrollBar(); 
    s.setVerticalScrollBar(b); 
    getContentPane().add(s); 
    setSize(100, 100); 
    setVisible(true); 
} 

public static void main(String[] args) { 
    new TestScrollBarMain(); 
} 

public class MyScrollBarUI extends BasicScrollBarUI { 

    @Override 
    protected void paintThumb(final Graphics g, final JComponent c, final Rectangle thumbBounds) { 
     if (thumbBounds.isEmpty() || !this.scrollbar.isEnabled()) { 
      return; 
     } 
     g.translate(thumbBounds.x, thumbBounds.y); 
     g.setColor(this.thumbDarkShadowColor); 
     g.drawOval(2, 0, 14, 14); 
     g.setColor(this.thumbColor); 
     g.fillOval(2, 0, 14, 14); 
     g.setColor(this.thumbHighlightColor); 
     g.setColor(this.thumbLightShadowColor); 
     g.translate(-thumbBounds.x, -thumbBounds.y); 
    } 

    @Override 
    protected void paintTrack(final Graphics g, final JComponent c, final Rectangle trackBounds) { 
     g.setColor(Color.black); 
     g.fillRect(trackBounds.width/2, trackBounds.y, 3, trackBounds.height); 
     if (this.trackHighlight == BasicScrollBarUI.DECREASE_HIGHLIGHT) { 
      this.paintDecreaseHighlight(g); 
     } else if (this.trackHighlight == BasicScrollBarUI.INCREASE_HIGHLIGHT) { 
      this.paintIncreaseHighlight(g); 
     } 
    } 
} 

public class MyScrollBar extends JScrollBar { 

    MyScrollBar() { 
     super(); 
     setUI(new MyScrollBarUI()); 
    } 
} 

} 
+0

一個漂亮的外觀爲您的問題也很重要... – 2010-05-19 11:52:47

+0

請提供paintThumb和paintTrack代碼 – akf 2010-05-19 12:39:59

回答

1

這包括你的MyScrollBarUI代碼:

protected void setThumbBounds(int x, int y,int width,int height) 
    { 
     super.setThumbBounds(x, y, 14, 14); 
    } 
    protected Rectangle getThumbBounds() 
    { 
     return new Rectangle(super.getThumbBounds().x,super.getThumbBounds().y,14,14); 
    } 
    protected Dimension getMinimumThumbSize() 
    { 
     return new Dimension(14,14); 
    } 
    protected Dimension getMaximumThumbSize() 
    { 
     return new Dimension(14,14); 
    }