2010-01-01 98 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()方法