2012-05-05 36 views
2

我決定在鞦韆和自定義繪畫組件的材料中潛入一點點deeeper。 最近幾天,我在StackOverFlow和其他論壇上閱讀了大量文章,API文檔和問題。但是我仍然在理解這個概念時遇到了一些基本問題。自定義JScrollBar-Thumb已繪製,但不移動

我想要做的事:基本上,我想爲我自己的Swing GUI設計一些組件。設計自定義JButton時沒有太多問題。我只是在paint.net中創建一個自定義圖像,創建一個ImageIcon並使JButton.setIcon(ImageIcon),工作正常。同樣的故事,如果我想自定義一個JSlider的拇指。我在這裏找到了一個很有趣的解它只是無視任何默認縮略圖,並在第二步中將「Slider.horizo​​ntalThumbIcon」的自定義ImageIcon(使用通過ClassLoader的自定義createImageIcon類)放到UIManger中。

UIManager.getLookAndFeelDefaults().put("Slider.horizontalThumbIcon", new Icon(){ 

    public int getIconHeight() { 
     return 0; 
    } 

    public int getIconWidth() { 
     return 0; 
    } 

    public void paintIcon(Component c, Graphics g, int x, int y) { 
     //do nothing 
    } 
}); 

UIManager.getLookAndFeelDefaults().put("Slider.horizontalThumbIcon", 
             createImageIcon("images/slider.png")); 

但現在的問題開始。如果我沒有錯,ScrollBar的拇指不是一個圖標,所以我必須創建一個擴展BasicScrollBarUI的自己的「CustomScrollBarUI」類。此外,我不想要任何箭頭鍵。 OK,所以我做了以下(從一些示例代碼再次激勵我從這裏):

public class CustomScrollBarUI extends BasicScrollBarUI { 

    private ImageIcon img; 

    protected JButton createZeroButton() { 
     JButton button = new JButton("zero button"); 
     Dimension zeroDim = new Dimension(0,0); 
     button.setPreferredSize(zeroDim); 
     button.setMinimumSize(zeroDim); 
     button.setMaximumSize(zeroDim); 
     return button; 
    } 


    protected JButton createDecreaseButton(int orientation) { 
     return createZeroButton(); 
    } 


    protected JButton createIncreaseButton(int orientation) { 
     return createZeroButton(); 
    } 


    protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) { 
     BufferedImage img = new LoadBackgroundImage("images/slider.png").getImage(); 
     g.drawImage(img, 0, 0, new Color(255,255,255,0), null); 
    } 


    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); 
    } 
} 

的LoadBackGroundImage是自己的類,它通過創建類加載器的BufferedImage。滾動條的拇指現在是我自定義的「slider.png」,但它不移動。如果我把它拖下來,窗格會滾動,但拇指仍然在他的位置。 由於我還沒有理解所有的機制,我讀了關於paintImage方法。你必須提交一個ImageObserver,其功能我不太瞭解。我在網上發現了各種代碼示例(像我這樣做),但我認爲這不適用於必須移動(並重新繪製)的圖像。我該如何解決這個問題?如果我在paintThumb方法中繪製正常的圖形,它可以正常工作,但只要我繪製圖像,它就不會移動。

我希望有人能幫助我。提前致謝。

回答

2

在您的具體情況 - 你總是畫圖像@同一位置:

protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) { 
    BufferedImage img = new LoadBackgroundImage("images/slider.png").getImage(); 
    g.drawImage(img, 0, 0, new Color(255,255,255,0), null); 
} 

「0,0」在這裏是「X,Y」,在滾動條座標座標系統(零放置在左上角)。

您會在paintThumb方法(Rectangle thumbBounds)中獲取指向當前拇指位置的拇指邊界 - 只需使用這些值將圖像繪製在適當的位置即可。

如果您的拇指圖片尺寸不符合收到的thumbBounds,您可以計算它的中間點和中心圖像。這只是一個例子 - 你可以用任何你喜歡的方式來完成。

我想補充一點,幾乎在各種UI中的每個分離的paint-method都放在同一個座標系中,所以你總是必須使用接收座標/邊界/ ...來放置你正在繪製的或者計算它在你自己的。

+0

真棒,非常感謝。當然這很有道理! :)如果你不介意,我可以問別的。在我的具體情況中,我將ScrollPane放在帶測試值的JList上。現在,如果我移動ScrollBar,列表中的字符串不會被正確繪製。查看圖片tp://tinypic.com/r/1195eoj/6。你有什麼想法爲什麼發生這種情況。我認爲,一些repaint() - 調用不正確,稱爲 –

+0

對不起,鏈接是http://tinypic.com/r/1195eoj/6 –

+0

它可能是一些異常拋出內部的渲染器,甚至一些外部繪畫問題名單。我會讓你把這個問題轉移到StackOverflow上的一個單獨的問題線程中,並顯示一些有關該問題的代碼。 –