绘JPanel背景

时间:2010-01-01 05:40:25

标签: java background jpanel paint

如何告诉paint方法仅在JPanel上绘制背景而不是在整个JFrame上绘制背景。 我的JFrame大小比JPanel大。当我尝试为JPanel绘制网格背景时,网格似乎遍布JFrame而不仅仅是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)

}

5 个答案:

答案 0 :(得分:5)

如果你想在JPanel上绘画,那么覆盖JPanel,而不是JFrame。

您应该覆盖JPanel的paintComponent()方法。阅读Custom Painting上的Swing教程中的部分,以获取一个工作示例。

答案 1 :(得分:4)

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

您需要严格地将图纸与不同的组件分开。摇摆已经是 管理子组件,因此绝对不需要在您的实施中实现图纸 框架中的面板(调用paintComponents()是一个严重的错误)。 你永远不应该覆盖paint(),因为只有paintComponent() 用于Swing。在你完全知道自己在做什么之前,不要混用它们。

答案 2 :(得分:0)

super.paintComponents(g);

我建议你作为第一个调查点。

答案 3 :(得分: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的整个区域,直到其他Component添加到JFrame或LayoutManager更改。

答案 4 :(得分:0)

您应该覆盖JPanel,而不是JFrame来进行绘画。您可以覆盖JPanel的paintComponent()方法