如何在JPanel上绘制网格线作为背景

时间:2009-12-08 22:39:56

标签: java grid line jpanel

我有问题。我在JFrame中使用了Gridbaglayout。其中一个组成部分是JPanel。

我想绘制一个网格线作为我的JPanel的背景。例如,在下面的程序中,它应该产生3条垂直线和3条水平线,但它只显示2条垂直线和2条水平线。最后一行未显示。

另一个问题是,似乎JPanel的大小比我设定的大。我注意到这一点的长度比JPanel的白色背景短。

  public class drawLayout extends JComponent 
    {

 public Dimension getPreferredSize() { 
  return new Dimension(600, 600); 
 }

 public int getY() { 
  return 0; 
 } 

 public int getX() { 
   return 0; 
    }

    @Override public void paintComponent(Graphics g)
    {
     g.setPaint(Color.GRAY);

            for (int i = 0; i <= getSize().width; i += 300) 
            {
               g2.drawLine(i, 0, i, getSize().height);
            }

            for (int i = 0; i <= getSize().height; i += 300) 
            {
               g2.drawLine(0,i, getSize().width, i);
            }
    } 
}

编辑:

http://www.freeimagehosting.net/image.php?1af16edc28.jpg

解决了第一个问题(网格线显示在JPanel上)。 另一个问题困惑了我。正如您在附加的图像上看到的那样,当查看网格的长度(标记为红色框)时,JPanel的大小似乎超过600。如何解决这个问题,以使网格线背景看起来不错,网格线外没有任何额外的空白区域?

2 个答案:

答案 0 :(得分:3)

如果你的JPanel的大小是600,那么它的可用坐标只会从0到599.不会绘制600的线。

此外,任何边框和/或插图都会进一步减少可用空间。

更新:我有一段时间,所以我写了你的申请。希望你能找到一些有用的提示。

public class Jessy extends JFrame {

   private static final int DRAWING_SIZE = 600;
   private static final int SUBDIVISIONS = 2;
   private static final int SUBDIVISION_SIZE = DRAWING_SIZE / SUBDIVISIONS;

   public Jessy() {
      setSize(800, 800);
      setLayout(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.weightx = 1.0;
      gbc.weighty = 1.0;
      gbc.gridx = 0;
      gbc.gridy = 0;
      JLabel drawingBoard = new JLabel("Drawing Board");
      gbc.anchor = GridBagConstraints.SOUTH;
      drawingBoard.setFont(new Font("Serif", Font.BOLD, 28));
      add(drawingBoard, gbc);
      JPanel panel = new JPanel() {
         @Override public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setPaint(Color.GRAY);
            for (int i = 1; i < SUBDIVISIONS; i++) {
               int x = i * SUBDIVISION_SIZE;
               g2.drawLine(x, 0, x, getSize().height);
            }
            for (int i = 1; i < SUBDIVISIONS; i++) {
               int y = i * SUBDIVISION_SIZE;
               g2.drawLine(0, y, getSize().width, y);
            }
         }          
      };
      panel.setPreferredSize(new Dimension(DRAWING_SIZE, DRAWING_SIZE));
      panel.setBackground(Color.WHITE);
      panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
      gbc.gridy++;
      gbc.anchor = GridBagConstraints.CENTER;
      add(panel, gbc);
      JButton saveDrawing = new JButton("SAVE DRAWING");
      gbc.gridy++;
      gbc.anchor = GridBagConstraints.NORTH;
      add(saveDrawing, gbc);
   }
   public static void main(String[] args) {
      (new Jessy()).setVisible(true);
   }
}

一些细节:

  • 我在外线上使用了Border,这为我们省去了“599”的麻烦。
  • 我假设你想要一个内部的细分网格,所以我添加了一些管道,以使其灵活和可配置。
  • 我注意到您paintComponents()没有致电super.paintComponents()。应该!
  • 我使用了我认为是指定gridbag约束所需的最少编码。减少编码=减少错误:)。
  • 我将JPanel(根据您所写的内容)而不是JComponent(根据您的代码中的内容)子类化。差异似乎是JComponent无法绘制其背景,因此最终变灰。
  • 也许最重要的是,我用kruler测量了我的GUI:绘图组件的大小正好是600! :)

答案 1 :(得分:0)

你正在增加300.经过两次迭代后,我就是600,你退出for循环。 尝试将尺寸设置为601或增加299.您还可以在比较中使用宽度+ 1和高度+ 1.