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

Java 如何在JPanel上绘制网格线作为背景,java,grid,line,jpanel,Java,Grid,Line,Jpanel,我有个问题。我在JFrame中使用了Gridbaglayout。其中一个组件是JPanel 我想画一条网格线作为我的JPanel的背景。e、 在下面的程序中,它应该产生3条垂直线和3条水平线,但是它只显示2条垂直线和2条水平线。最后一行没有显示 另一个问题是,JPanel的大小似乎比我设定的要大。我通过线条的长度注意到了这一点,线条比JPanel白色背景短 public class drawLayout extends JComponent { public Dimension

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

我想画一条网格线作为我的JPanel的背景。e、 在下面的程序中,它应该产生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);
            }
    } 
}
公共类drawLayout扩展JComponent
{
公共维度getPreferredSize(){
返回新维度(600600);
}
public int getY(){
返回0;
} 
public int getX(){
返回0;
}
@替代公共零部件(图形g)
{
g、 setPaint(颜色:灰色);

对于(int i=0;i您将i增加300。两次迭代后,i为600,您将退出for循环。
尝试将尺寸设置为601或增加299。您也可以在比较中使用宽度+1和高度+1。

如果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);
   }
}
公共类Jessy扩展JFrame{
专用静态最终整型图纸尺寸=600;
私有静态最终整数细分=2;
专用静态最终整型细分\尺寸=图纸\尺寸/细分;
公众杰西(){
设置大小(800800);
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.weightx=1.0;
gbc.weighty=1.0;
gbc.gridx=0;
gbc.gridy=0;
JLabel drawingBoard=新JLabel(“绘图板”);
gbc.anchor=gridbag.SOUTH;
drawingBoard.setFont(新字体(“衬线”,Font.BOLD,28));
添加(绘图板,gbc);
JPanel面板=新的JPanel(){
@替代公共零部件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
g2.setPaint(颜色为灰色);
对于(int i=1;i<细分;i++){
int x=i*细分大小;
g2.抽绳(x,0,x,getSize().高度);
}
对于(int i=1;i<细分;i++){
int y=i*细分大小;
g2.绘制线(0,y,getSize().宽度,y);
}
}          
};
面板。设置首选尺寸(新尺寸(图纸尺寸、图纸尺寸));
面板.立根背景(颜色.白色);
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
gbc.gridy++;
gbc.anchor=GridBagConstraints.CENTER;
添加(面板,gbc);
JButton saveDrawing=新JButton(“保存图形”);
gbc.gridy++;
gbc.anchor=gridbag.NORTH;
添加(保存图形,gbc);
}
公共静态void main(字符串[]args){
(新Jessy()).setVisible(true);
}
}
一些细节:

  • 我在外线上用了一个边框,这样就省去了599的麻烦
  • 我以为你想要一个细分的网格在里面,所以我添加了一些管道,使其灵活和可配置
  • 我注意到您的
    paintComponents()
    没有调用
    super.paintComponents()
    。它应该
  • 我使用了我认为是最低要求的编码来指定gridbag约束
  • 我将JPanel子类化(根据您编写的内容)而不是JComponent子类化(根据您的代码中的内容)。区别似乎在于JComponent无法绘制其背景,因此结果是灰色的
  • 也许最重要的是,我用kruler测量了我的GUI:绘图组件的大小正好是600(双向!)

谢谢Andres。我已经将维度增加到601,它显示了最后一行。但是我很好奇,因为我已经设置了限制,Carl在下面说了,但是600的维度给出了从0到599的范围。因此在第三次提交时,I=600,宽度=599。因此我>宽度。谢谢Andres。还有一个问题,为什么JPanel看起来更大r?如何使其仅显示600 X 600的精确尺寸?将尺寸保留为600,并在油漆组件代码末尾添加以下两行:g2.绘制线(getSize().width,0,getSize().width,getSize().height);g2.绘制线(getSize().height,0,getSize().height,getSize().width);谢谢你的回答Carl。我的Jpanel看起来大于600。我没有使用边框或插图。如果它看起来大于600,但你没有看到第三行,那么额外的空间就在面板外面。你可以将ipadx/ipady设置为非0,或者填充为无,但有其他组件迫使你的单元格变大。最简单的测试方法是设置你的窗格l的背景色,以便您可以看到其边缘的位置。为了完整性,还可以在GridBagConstraints中设置插图。但这并不能解释您的面板>600。我只是查看了您的屏幕截图,没有找到任何关于我看到的内容的解释。请向我们展示您的GUI代码!Pastebin可能是一个很好的方法来完成此操作:+1 for tak“你应该点击绿色复选框来接受这个答案。这只是对那些为你做了那么多工作的人的礼貌。”。