2010-03-09 122 views
3

我有一種情況,在GridLayout上有一堆JButton。我需要每個這些Jbutton的有:在JButton上繪製圖形

  1. 背景圖像(但保留保持默認按鈕的外觀,如果需要的能力)
  2. 自定義圖形的其他類

我在上面畫對背景圖像沒有任何問題,因爲我使用的是setIcon(),但是我在繪製背景上的東西時遇到問題。有一次,我能夠在按鈕的頂部繪圖,但點擊按鈕後,圖紙消失了。如何使按鈕保持這種繪圖狀態?

基本上,我需要爲我的Jbutton將辦法有公共的方法,將允許其他類就可以了,例如畫什麼:

public void drawSomething() { 
    Graphics g = this.getGraphics(); 
    g.drawOval(3,2,2,2); 
    repaint(); 
} 

public Graphics getGraphics() { 
    return this.getGraphics(); 
} 

然後另一個類可以做這個:

button.getGraphics().drawSomething(); 

後者更多我要找的,但第一個是同樣有用的。

有什麼辦法可以解決這個問題嗎?另外,覆蓋父類方法paintComponent()並不能幫助,因爲我需要每個按鈕都有不同的圖形。

回答

8

您可以繼承JButton並覆蓋paintComponent()。 您可以通過爲子類提供外部「畫家」來處理每個具有不同圖形的按鈕。或者爲每個不同的圖形創建一個不同的子類。

public class MyButton extends JButton { 
    private Painter painter; 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     painter.paint(g); 
    } 
} 

public interface Painter { 
    public void paint(Graphics g); 
} 

你不能只是在畫上按鈕,因爲當下一次重新繪製按鈕時畫會丟失。

+1

我之前實際上一直在使用這種方法,除了我沒有使用接口。我放棄了它,因爲我認爲可能有更簡單的方法。這是一個更優雅的方法,謝謝。 – trinth 2010-03-09 07:19:42

+0

很高興它幫助你 – objects 2010-03-10 23:59:59

3

您可以創建一個BufferedImage並對其進行自定義繪製,然後在自定義paintComponent(...)方法中繪製圖像。

看看Custom Painting Approaches的DrawOnImage示例。

+1

感謝您的回答,我考慮過這個,但已決定與接口答案一起去。 – trinth 2010-03-09 07:17:40