2010-01-01 82 views
4

如何判斷paint方法只在JPanel上繪製背景,而不是在整個JFrame上繪製背景。 我的JFrame大小比JPanel大。當我嘗試繪製JPanel的網格背景時,網格似乎被繪製到JFrame而不僅僅是JPanel。代碼JPanel的油漆背景

以下部分組成:

public class Drawing extends JFrame { 
    JPanel drawingPanel; 
    ........... 
    public Drawing(){ 
    drawingPanel = new JPanel(); 
    drawingPanel.setPreferredSize(new Dimension(600,600)); 
    } 


public void paint(Graphics g) 
{ 
    super.paintComponents(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    paintBackground(g2); //call a METHOD to paint the for JPANEL 
} 


private void paintBackground(Graphics2D g2) 
{ 
    g2.setPaint(Color.GRAY); 
    for (int i = 0; i < drawingPanel.getSize().width; i += 300) 
    { 
    Shape line = new Line2D.Float(i, 0, i, drawingPanel.getSize().height); 
    g2.draw(line); 
    } 

    for (int i = 0; i < drawingPanel.getSize().height; i += 300) 
    { 
    Shape line = new Line2D.Float(0, i, drawingPanel.getSize().width, i); 
    g2.draw(line); 
    }  
} //END private void paintBackground(Graphics2D g2) 

} 
+1

我給你正確的答案,但你不接受它。很高興知道未來。 – camickr 2010-01-01 17:15:14

回答

3

camickr是正確的。所以:

public class Drawing extends JFrame { 
    JPanel drawingPanel; 
    ........... 
    public Drawing(){ 
    drawingPanel = new MyPanel(); 
    drawingPanel.setPreferredSize(new Dimension(600,600)); 
    add(drawingPanel); 
    } 
} 

public class MyPanel extends JPanel { 
    public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

    myBackgroundRoutine(g2); 
    } 
} 

您需要嚴格區分您的繪圖與不同的組件。 Swing已經是管理子組件的 ,因此絕對沒有必要在您的框架中執行繪圖 面板(調用paintComponents()是一個嚴重的錯誤)。 而且您不應該重寫paint(),因爲在Swing中只使用paintComponent() 。在你完全知道你在做什麼之前,不要混淆兩者。

+0

感謝Thorsten。 – Jessy 2010-01-01 16:39:28

0
super.paintComponents(g); 

我建議作爲調查的第一站。

+0

謝謝,我已經嘗試過,但是因爲我的程序涉及使用鼠標拖動進行繪圖,所以我需要super.paintComponents(s)刪除先前繪圖的軌跡,這是將我的繪圖拖到新位置時的情況。 – Jessy 2010-01-01 05:53:12

5

如果您想在JPanel上進行繪製,請覆蓋JPanel,而不是JFrame。

您應該重寫JPanel的paintComponent()方法。閱讀Swing教程Custom Painting中的部分以獲得一個工作示例。

+0

感謝您的鏈接 – Jessy 2010-01-01 16:40:01

0

您發佈的代碼不完整,它缺少如何將面板添加到JFrame以及正在使用哪個LayoutManager。
代碼接縫是正確的。你確定JPanel不佔用整個JFrame嗎?添加一個System.out.println(drawingPanel.getSize())來檢查這一點。
如果您使用的是BorderLayout,默認爲JFrame,並且剛添加面板沒有任何限制,面板將使用整個區域。 PreferredSize被忽略。
試試這個,只是爲了測試:

public Drawing(){ 
    drawingPanel = new JPanel(); 
    drawingPanel.setPreferredSize(new Dimension(600,600)); // ignored 
    drawingPanel.setBounds(0, 0, 600, 600); // location and size 
    setLayout(null); 
    add(drawingPanel); 
} 

但IMO這是不是最好的或者做正確方式。正如Thorsten和camickr所建議的那樣,我寧願重寫JPanel中的paintComponent()方法。
但它仍然會使用JFrame的整個區域,直到其他組件被添加到JFrame或LayoutManager更改爲止。

0

您應該覆蓋JPanel,而不是JFrame進行繪畫。你可以覆蓋JPanel的paintComponent()方法