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

最佳答案

您四舍五入为时过早。 htOfRowwdOfRow不是精确的int值。通过将它们强制转换为int,可以使整个网格的范围内累积少量错误。

而是将它们保留为double,将它们乘以k,然后才将其转换回int

例如:

如果为width = 100cols = 8,则为wdOfRow = 12.5

如果在int乘以k之前将其转换为k=8,则将最后一行放置在12*8=96处。

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

这是固定代码:

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

关于java - Canvas 中的网格,最后一个单元格的大小与其他单元格不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10059435/

10-14 13:41
查看更多