簡體   English   中英

繪JPanel背景

[英]Paint background of JPanel

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

}

如果你想在JPanel上繪畫,那么覆蓋JPanel,而不是JFrame。

您應該重寫JPanel的paintComponent()方法。 閱讀自定義繪畫的Swing教程中的部分以獲取工作示例。

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()。 在你完全知道自己在做什么之前,不要混淆兩者。

super.paintComponents(g);

我建議你作為第一個調查點。

您發布的代碼不完整,缺少如何將面板添加到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的建議中覆蓋paintComponent()方法。
但它仍然會使用JFrame的整個區域,直到其他Component添加到JFrame或LayoutManager更改為止。

您應該覆蓋JPanel,而不是JFrame來進行繪畫。 您可以覆蓋JPanel的paintComponent()方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM