2012-08-24 88 views
0

在我的paintComponent()方法中,我有一個drawRect()繪製jpanel的背景。但是因爲在paintComponent()方法被調用之前jbutton被繪製在屏幕上,所以jbutton被drawRect屏蔽掉了。有誰知道如何解決這一問題?我的猜測是在repaint被調用之前添加jbutton,但我不知道該怎麼做?java repaint塊jbutton

一些代碼:

public Frame(){ 
    add(new JButton()); 
} 

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.drawRect(0,0,screenwidth,screenheight); //paints the background with a color 
              //but blocks out the jbutton. 
} 
+1

「框架」是否擴展了「JFrame」? – Jeffrey

+1

這真是奇怪的代碼,因爲我同意Jeffrey的看法,你好像試圖重寫一個不應該發生的JFrame類的'paintComponent(...)'方法。請在'paintComponent(...)'方法之前放置'@ Override'。確保你重寫'paintComponent(...)'和** not **'paintComponents(...)',因爲有一個** big **的區別。如果您可以發佈[sscce](http://sscce.org)讓我們親眼看到並親身體驗您的問題,那就太好了。 –

+0

好吧,我編輯了這篇文章,這只是一個示例代碼,我很快輸入了不是我的實際項目 – Ewen

回答

5

我這樣做真的快速測試。正如Hovercraft FullOfEels指出的那樣。 JFrame沒有paintComponent,所以我用JPanel代替。

Can you see me

這是由這個代碼

public class PanelTest extends JPanel { 

    private JButton button; 

    public PanelTest() { 

     setLayout(new GridBagLayout()); 

     button = new JButton("Can you see me ?"); 
     add(button); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 

     super.paintComponent(g); 

     Rectangle bounds = button.getBounds(); 
     bounds.x -= 10; 
     bounds.y -= 10; 
     bounds.width += 20; 
     bounds.height += 20; 

     g.setColor(Color.RED); 
     ((Graphics2D)g).fill(bounds); 

    } 

} 

我有我嘗試通過在JFrame使用paintComponents複製問題產生的,我沒有看到的矩形。即使我在JFrame上覆蓋了paint,該矩形仍然繪製在按鈕下(不是我曾經推薦過的)。

的問題是,你還沒有給我們足夠的代碼知道是什麼地方出了錯

PS - drawRect不會「補」什麼

+2

我猜測有一些不好聞的代碼正在進行,也許他試圖從paintComponent中添加組件 - 很難猜到。 –

+0

+1個不錯的例子 –

+1

@HovercraftFullOfEels它可能是一個沉重的/輕量級的問題,我只是做出狂野的假設,這從來不是一個聰明的主意:P – MadProgrammer

6

現在,首先,我會告訴你什麼你」在這裏做錯了 - JFrame不是JComponent,並且沒有paintComponent供您覆蓋。你的代碼可能永遠不會被調用。除此之外,drawRect只畫一個矩形 - 它確實是而不是填充一個。


但是,我相信有一個正確的方法來做到這一點。

由於您使用的是JFrame,你應該通過JFrame.getLayeredPane利用容器的分層窗格的。

分層窗格是一個容器,其深度使得重疊的組件可以相互重疊。關於分層窗格的一般信息在How to Use Layered Panes。本節討論根面板如何使用分層窗格的細節。

根窗格覆蓋在How to Use Root Panes,Java教程的一部分。分層窗格是根窗格的子項,作爲頂層容器的JFrame使用基礎JRootPane

不管怎麼說,既然你有興趣創建一個後臺,看到一個分層窗格通常的外觀的頂級容器內,如下圖:

下表描述了用於每個層中使用並列出對應於每個層中的JLayeredPane常數:

層名 - 價值 - 說明

FRAME_CONTENT_LAYER - new Integer(-30000) - 根窗格在這個深度增加了菜單欄和內容窗格的分層窗格。

因爲我們要指定我們的背景是後面的內容中,我們首先將其添加到同層(JLayeredPane.FRAME_CONTENT_LAYER),具體如下:

final JComponent background = new JComponent() { 

    private final Dimension size = new Dimension(screenwidth, screenheight); 

    private Dimension determineSize() { 
    Insets insets = super.getInsets(); 
    return size = new Dimension(screenwidth + insets.left + insets.right, 
     screenheight + insets.bottom + insets.top); 
    } 

    public Dimension getPreferredSize() { 
    return size == null ? determineSize() : size; 
    } 

    public Dimension getMinimumSize() { 
    return size == null ? determineSize() : size; 
    } 

    protected void paintComponent(final Graphics g) { 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, screenwidth, screenheight); 
    } 
}; 
final JLayeredPane layeredPane = frame.getLayeredPane(); 
layeredPane.add(background, JLayeredPane.FRAME_CONTENT_LAYER); 

現在,以確保我們之前得出我們的背景的內容,我們使用JLayeredPane.moveToBack

layeredPane.moveToBack(background); 
+0

+1一個很好的描述(和漂亮的圖片) – MadProgrammer

+1

圖片來自Oracle Java教程 –

+0

@MadProgrammer謝謝! :-) – oldrinb

1

我以前也遇到過這一點,雖然沒有明確,而不是JFrame的那種,你有情景。試試這個代碼,

this.getContentPane.repaint(); 

在你的jframe上。林不知道這一點,但試試看。

+0

這是什麼?你能解釋更多嗎? – Ewen

+0

自從我完成java GUI以來,它已經有一段時間了,但它只是重新加載或清除一個框架中的每個組件。清除意味着不刪除您的圖紙,但拋光組件上的設計聲明。我不知道java文檔如何解釋它,這只是基於我自己的理解。無論何時我必須在jDesktopPane中加載圖片,我都會使用此代碼。 – user1577161

+0

我認爲如果你在你的代碼中正確地聲明它的代碼片段(即繪製矩形後),代碼片段就可以工作。祝你好運! – user1577161