画布中的网格,最后单元格的大小与其他单元格不同

时间:2012-04-08 00:16:53

标签: java canvas grid

如何使用相同尺寸的网格绘制画布? 问题:http://tinypic.com/r/idvc0j/5 代码绘制的最后一个单元格的大小与其他单元格不平行。 我必须在paint()方法中做些什么改变?

import java.awt.*;
import javax.swing.*;

public class Grid extends Canvas{

    Cell[][] maze;
    int rows;
    int cols;

    Grid(int rows, int cols) {
        this.rows = rows;
        this.cols = cols;
        maze = new Cell[rows][cols];
    }

    public static void main(String[] args){
        JFrame f = new JFrame("Sample");
        Grid x = new Grid(25,25);
        f.add(x);
        f.pack();
        f.setVisible(true);
        f.setSize(600,600);
        f.setResizable(false);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void paint(Graphics g) {
    int k;
    int width = getSize().width;
    int height = getSize().height;

    int htOfRow = height / (rows);
    for (k = 0; k < rows; k++)
        g.drawLine(0, k * htOfRow , width, k * htOfRow );

    int wdOfRow = width / (cols);
    for (k = 0; k < cols; k++)
        g.drawLine(k*wdOfRow , 0, k*wdOfRow , height);
    }
}

class Cell {

//  private final static int NORTH = 0;
//  private final static int EAST = 1;
//  private final static int WEST = 2;
//  private final static int SOUTH = 3;
//  private final static int NO = 0;
//  private final static int START = 1;
//  private final static int END = 2;
//  boolean[] wall = new boolean[4];
//  boolean[] border = new boolean[4];
//  boolean[] backtrack = new boolean[4];
//  boolean[] solution = new boolean[4];
//  private boolean isVisited = false;
//  private boolean isCurrent = false;
//  private int Key = 0;
//  
//  public Cell(){
//  for(int i=0;i<4;i++){wall[i] = true;}
//  }
//  public void setStart(int i){Key = i;}   
//  public int getKey(){return Key;}
//  public boolean checkVisit(){return isVisited;}
//  public void stepIn(){
//      isCurrent = true;
//      isVisited = true;
//  }
//  public void stepOut(){isCurrent = false;}
}

2 个答案:

答案 0 :(得分:1)

你太早了。 htOfRowwdOfRow不是确切的int值。通过将它们转换为int,您可以在整个网格的范围内累积小错误。

相反,请将它们保留为double,将它们乘以k,然后再将它们转回int

例如:

如果width = 100cols = 8wdOfRow = 12.5

如果您在int之前将其投放到k,那么您将最后一行放在k=8

如果您乘以12*8=96然后转换为double,则最后一行将位于int

这是固定代码:

12.5*8 = 100

答案 1 :(得分:0)

每个方向还需要一条线。如果你做k&lt; = rows和k&lt; = cols,它会根据我的想法将它分开。