3

我有个问题。我在我的 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。我该如何解决这个问题,使网格线背景看起来不错,而在网格线之外没有任何额外的空白?

4

2 回答 2

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

一些细节:

  • 我为外线使用了边框,这为我们省去了“599”的一些麻烦。
  • 我假设你想要在内部有一个细分的网格,所以我添加了一些管道以使其灵活和可配置。
  • 我注意到你paintComponents()没有打电话super.paintComponents()。它应该!
  • 我使用了我认为是最低要求的编码来指定网格包约束。更少的编码=更少的错误:​​)
  • 我继承了 JPanel(根据您编写的内容)而不是 JComponent(根据您的代码中的内容)。不同之处似乎在于 JComponent 无法绘制其背景,因此最终呈现灰色。
  • Perhaps most importantly, I measured my GUI with kruler: The drawing component is exactly 600 in size both ways! :)
于 2009-12-08T22:49:44.680 回答
0

您将 i 增加 300。两次迭代后,i 为 600,然后您退出 for 循环。尝试将尺寸设置为 601 或增加 299。您也可以在比较中使用 width+1 和 Height+1。

于 2009-12-08T22:48:44.053 回答