2012-04-08 6 views
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;} 
} 

答えて

1

あまりにも早く四捨五入しています。 htOfRowおよびwdOfRowは、正確にはintの値ではありません。 intにキャストすると、グリッド全体のスパンに小さな誤差が蓄積されます。

代わりにdoubleとして保存し、kを掛けてintにキャストしてください。例えば

width = 100た場合、その後cols = 8wdOfRow = 12.5

にキャストする場合は、にkを掛けてから最後の行を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); 
     } 
    } 
} 
+0

とされていても26x26になりましたいいえ、私が編集した私の前のコメントを無視してください、これは動作します。丸めがプログラムに影響を与えているとは思わなかった。私が思った別の解決策は、キャンバスを読み込むJFrameのサイズを606 x 628にすることです。側面の境界線はそれぞれ3 px、上下は28 pxです。 –

+0

[OK]を、私は私の全体の固定テストコードを掲載しました。あなたがちょうどその逐語をコピーして実行すると、あなたは何を見ますか? – ulmangt

+0

は行です 長方形rect = this.getBounds(); は本当に必要ですか?あなたはそれを使わなかったように見えます。私がコンパイルしたとき、同じ結果が得られます。 –

0

各方向にもう1行必要です。あなたがkをしたら< =行とk < = cols、それはあなたがそれを望むと思うように物事を分割します。

+0

はありません、それは私はそれが25×25 –