【问题标题】:Paint background of JPanelJPanel的绘制背景
【发布时间】:2010-01-01 05:40:24
【问题描述】:

如何告诉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)

}

【问题讨论】:

  • 我给了你正确的答案,但你不接受。很高兴知道未来。

标签: java background jpanel paint


【解决方案1】:

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

您应该重写 JPanel 的 paintComponent() 方法。请阅读 Custom Painting 上的 Swing 教程中的部分以获取工作示例。

【讨论】:

    【解决方案2】:

    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 中使用。在您完全清楚自己在做什么之前,不要将两者混为一谈。

    【讨论】:

      【解决方案3】:
      super.paintComponents(g);
      

      我建议您首先进行调查。

      【讨论】:

      • 谢谢,我已经尝试过了,但是由于我的程序涉及使用鼠标拖动进行绘图,所以当我将绘图拖动到新位置时,我需要 super.paintComponents(s) 来删除先前绘图的轨迹.
      【解决方案4】:

      您发布的代码不完整,缺少如何将面板添加到 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 所建议的,我更愿意覆盖 JPanel 中的 paintComponent() 方法。
      但它仍然会使用 JFrame 的整个区域,直到将其他 Component 添加到 JFrame 或更改 LayoutManager。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-08
          • 1970-01-01
          • 2013-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多