1

如何用相同大小的网格绘制画布?问题: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;}
}
4

2 回答 2

1

You are rounding too early. htOfRow and wdOfRow are not exact int values. By casting them to int you let small errors accumulate over the span of the whole grid.

Instead, keep them as double, multiply them by k and only then cast them back to int.

For example:

If width = 100 and cols = 8 then wdOfRow = 12.5.

If you cast it to an int before multiplying by k when k=8 then you place your last line at 12*8=96.

If you multiply as double then cast to int, your last line will be at 12.5*8 = 100

Here's the fixed code:

import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Rectangle;

import javax.swing.JFrame;

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

    static class Cell
    {

    }

    public static 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 void paint( Graphics g )
        {
            int k;

            double width = getSize( ).width;
            double height = getSize( ).height;

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

            double wdOfRow = width / ( cols );
            for ( k = 0; k < cols; k++ )
                g.drawLine( ( int ) ( k * wdOfRow ), 0, ( int ) ( k * wdOfRow ), ( int ) height );
        }
    }
}
于 2012-04-08T04:31:15.797 回答
0

您需要在每个方向再增加一条线。如果您执行 k <= rows 和 k <= cols,它会按照我认为您想要的方式划分内容。

于 2012-04-08T01:43:23.523 回答