绘制JPanel的背景

4

如何让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)

}

1
我给了你正确的答案,但你不接受它。将来知道就好了。 - camickr
5个回答

5

如果你想在JPanel上绘制图画,那么应该重写JPanel而不是JFrame。

你应该重写JPanel的paintComponent()方法。阅读Swing教程中关于自定义绘画部分以获取一个可用的示例。


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已经管理子组件,因此无需在Frame中的面板中实现绘画(调用paintComponents()是一个严重的错误)。 而且你永远不应该重写paint(),因为在Swing中只使用paintComponent()。除非你确切知道自己在做什么,否则不要混合两者。


0
super.paintComponents(g);

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

谢谢,我已经尝试过了,但是由于我的程序涉及使用鼠标拖动进行绘图,因此我需要使用super.paintComponents(s)来清除之前绘制的痕迹,当我将图形拖到新位置时。 - Jessy

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

但在我看来,这不是最好或正确的方法。我更喜欢重写JPanel的paintComponent()方法,就像Thorsten和camickr建议的那样。
但它仍然会使用JFrame的整个区域,直到添加其他组件到JFrame或更改LayoutManager。


0
你需要覆盖 JPanel 而不是 JFrame 来进行绘制。你可以覆盖 JPanel 的 paintComponent() 方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接