2016-07-07 1 views
1

J'essaye de dessiner une grille. La colonne x rangée est, disons, 5x6. Mon problème est que les fins de ligne à l'est et au sud dépassent les valeurs de colonnes et de rangées données. Ce n'est pas grand, juste un millimètre peut-être, mais toujours agaçant. Je veux que la grille ressemble à un rectangle avec, dans le cas ci-dessus, 20 cellules. Où est le bug dans mon code? L'extrait de code qui dessine cette grille défectueuse est ci-dessous. THX!Pourquoi les extrémités des lignes sur ma grille dépassent-elles la largeur et la hauteur de cette grille?

package Main; 

import java.awt.Dimension; 

import javax.swing.JFrame; 

public class GridMain { 

    public static void main(String[] args) { 
     JFrame jframe = new JFrame(); 
     jframe.setPreferredSize(new Dimension(640, 730)); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Mypanel mypanel = new Mypanel(5,6); 
     jframe.add(mypanel); 
     jframe.pack(); 
     jframe.setVisible(true); 
    } 
} 
package Main; 

import java.awt.Graphics; 

import javax.swing.JPanel; 

public class Mypanel extends JPanel { 
    /** 
* 
*/ 
    private static final long serialVersionUID = 1L; 
    private int height; 
    private int width; 
    private int gapBetweenPoints = 20; 
    private int gapBetweenFrameAndGrid=15; 
    public Mypanel(int columns, int rows) { 
     width = columns; 
     height = rows; 
    } 

    protected void paintComponent(Graphics g) { 
     for (int i =0 ; i < height; i++) { 
      g.drawLine(gapBetweenFrameAndGrid, i * gapBetweenPoints 
        + gapBetweenFrameAndGrid, width * gapBetweenPoints, i 
        * gapBetweenPoints + gapBetweenFrameAndGrid); 
     } 
     for (int i = 0; i < width; i++) { 
      g.drawLine(i * gapBetweenPoints + gapBetweenFrameAndGrid, 
        gapBetweenFrameAndGrid, i * gapBetweenPoints + gapBetweenFrameAndGrid, 
        height * gapBetweenPoints); 
     } 
    } 
} 
+0

drôle, quand je soustrais 5 de (largeur * gapBetweenPoints) dans la première pour la boucle et de (hauteur * gapBetweenPoints) dans la seconde boucle je reçois le résultat que je veux .. mais ce n'est évidemment pas comment nous faisons les choses :-) – melar

Répondre

2

Soyez prudent lorsque vous obtenez votre point de départ; et je n'atteindrai pas à la largeur (taille) mais seulement la largeur-1/taille-1. Ainsi, le code suivant:

for (int i =0 ; i < height; i++) { 
     g.drawLine(gapBetweenFrameAndGrid, i * gapBetweenPoints 
       + gapBetweenFrameAndGrid, gapBetweenFrameAndGrid+(width-1) * gapBetweenPoints, i 
       * gapBetweenPoints + gapBetweenFrameAndGrid); 
    } 
    for (int i = 0; i < width; i++) { 
     g.drawLine(i * gapBetweenPoints + gapBetweenFrameAndGrid, 
       gapBetweenFrameAndGrid, i * gapBetweenPoints + gapBetweenFrameAndGrid, 
       gapBetweenFrameAndGrid+(height-1) * gapBetweenPoints); 
    } 

En général

for (int i =0 ; i < height; i++) { 
     g.drawLine(startingX, i * gapBetweenPoints 
       + gapBetweenFrameAndGrid, startingX+(width-1) * gapBetweenPoints, i 
       * gapBetweenPoints + gapBetweenFrameAndGrid); 
    } 
    for (int i = 0; i < width; i++) { 
     g.drawLine(i * gapBetweenPoints + gapBetweenFrameAndGrid, 
       startingY, i * gapBetweenPoints + gapBetweenFrameAndGrid, 
       startingY+(height-1) * gapBetweenPoints); 
    } 
+0

thx beaucoup! cela résout mon problème. juste pour plus de clarté: dans le deuxième code, dans la première boucle, pourquoi ne pas ajouter startX à (i * gapBetweenPoints) au lieu d'ajouter gapBetweenFrameAndGrid? qu'est-ce qui me manque? même chose pour la deuxième boucle – melar