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)

}
4

5 回答 5

5

如果您想在 JPanel 上进行绘画,请覆盖 JPanel,而不是 JFrame。

您应该重写 JPanel 的 paintComponent() 方法。阅读自定义绘画的 Swing 教程中的部分以获取工作示例。

于 2010-01-01T07:14:00.730 回答
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 中的 Panel 中实现绘图(调用 paintComponents() 是一个严重错误)。而且你永远不应该重写paint(),因为在Swing 中只使用了paintComponent()。在您完全知道自己在做什么之前,不要将两者混为一谈。

于 2010-01-01T13:54:30.930 回答
0
super.paintComponents(g);

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

于 2010-01-01T05:43:56.973 回答
0

您发布的代码不完整,缺少如何将面板添加到 JFrame 以及正在使用哪个 LayoutManager。
代码接缝是正确的。你确定 JPanel 没有占据整个 JFrame 吗?添加一个System.out.println(drawingPanel.getSize())来检查这一点。
如果您使用的是 JFrame 默认的 BorderLayout,并且刚刚添加了面板而没有任何约束,则面板使用整个区域。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 所建议的,我更愿意覆盖paintComponent()JPanel 中的方法。
但它仍然会使用 JFrame 的整个区域,直到将其他 Component 添加到 JFrame 或更改 LayoutManager 为止。

于 2010-01-01T17:24:02.333 回答
0

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

于 2015-12-07T13:48:14.037 回答