javafor-loopwordsearch

String array is not drawing the first row Word Search


I am making a word search for a homework, but i can't get the first row to draw, i've already created the 2 for loops and initialize them with 0.

I tried adding an additional letters row, but it is not the proper way to do it.

Please, i don't what it is going on.


    private int casillas;
    private Font font = new Font("Arial", Font.BOLD, 32);
    private String[][] letters = 
    {
            {"Z", "P", "D", "S", "Y", "I", "I", "H", "L", "H", "C", "S", "M", "O", "J", "T", "M", "I", "L", "E"},
            {"L", "A", "S", "T", "I", "N", "D", "E", "X", "T", "T", "O", "L", "A", "K", " C", "F", "E", "O", "N"},
            {"B", "E", "V", "H", "D", "Y", "G", "P", "A", "R", "D", "I", "N", "A", "T", "E", "S", "Z", "R", "D"},
            {"P", "P", "J", "E", "W", "G", "F", "R", "Y", "I", "E", "G", "W", "T", "U", "C", "L", "H", "U", "S"},
            {"J", "Y", "X", "E", "L", "A", "A", "M", "C", "M", "G", "N", "Z", "S", "A", "Q", "H", "P", "C", "W"},
            {"O", "O", "K", "O", "V", "H", "R", "K", "T", "V", "H", "I", "A", "A", "T", "I", "E", "Z", "C", "I"},
            {"F", "B", "Q", "D", "C", "H", "U", "Q", "E", "E", "C", "R", "P", "T", "D", "R", "N", "F", "M", "T"},
            {"S", "S", "K", "M", "G", "T", "X", "Z", "V", "K", "Z", "T", "H", "K", "L", "U", "A", "S", "G", "H"},
            {"M", "I", "B", "A", "W", "G", "L", "D", "R", "F", "Q", "S", "C", "O", "P", "M", "R", "T", "Q", "J"},
            {"V", "Y", "Y", "D", "O", "N", "Z", "U", "O", "G", "M", "B", "Q", "R", "G", "U", "Z", "T", "S", "S"},
            {"E", "C", "A", "L", "P", "E", "R", "T", "N", "S", "L", "U", "L", "D", "Q", "J", "Q", "V", "Y", "M"},
            {"O", "Q", "E", "J", "J", "L", "E", "W", "T", "C", "E", "S", "A", "S", "U", "I", "V", "R", "D", "C"},
            {"J", "W", "M", "K", "P", "R", "V", "Q", "Z", "H", "A", "R", "O", "W", "C", "O", "N", "C", "A", "T"},
            {"Q", "C", "Q", "S", "A", "A", "I", "E", "U", "Z", "D", "S", "G", "O", "U", "S", "N", "Z", "Z", "D"},
            {"Q", "U", "H", "P", "F", "R", "K", "W", "O", "L", "R", "I", "P", "S", "B", "S", "Y", "I", "Q", "E"},
            {"J", "S", "M", "O", "K", "Y", "E", "S", "A", "C", "R", "E", "W", "O", "L", "O", "T", "S", "X", "O"},
            {"C", "O", "O", "N", "L", "N", "F", "F", "Y", "T", "S", "G", "M", "K", "C", "B", "C", "L", "L", "E"},
            {"C", "P", "Q", "Y", "L", "T", "R", "Q", "K", "D", "Y", "Y", "E", "W", "B", "Z", "E", "V", "J", "N"},
            {"M", "E", "S", "T", "H", "R", "R", "V", "N", "W", "S", "B", "V", "B", "Y", "D", "V", "W", "S", "O"},
            {"K", "P", "Z", "N", "S", "M", "I", "V", "V", "L", "W", "F", "B", "U", "T", "V", "M", "T", "M", "C"}};

    public Cuadricula(int casillas) {
        this.casillas = casillas;
    }

    public void paint(Graphics2D g2d) {
        g2d.setFont(font);
        g2d.setColor(Color.WHITE);
        for (int i = 0; i < casillas; i += 32) {
            for (int j = 0; j < casillas; j += 32) {
                g2d.drawRect(i, j, 32, 32);
            }
        }


//Draw the letters in the grid
        ***for (int i = 0; i < letters.length; i ++) {
            for (int j = 0; j < letters.length; j ++) {
                g2d.drawString(letters[j][i], 32 * i, 32 * j);
            }
        }***

    }
}```

Solution

  • The first row is cutoff because the origin (0,0) is the baseline of the characters.

    This is resolved (one way) by translating the origin to compensate for character height.

    This demonstrates - two strings - first uses no translate at (0,0) which is not displayed and second is again (0,0) following the translate of the "ascent" of the font used:

    g.setFont(new Font("TimesRoman", Font.PLAIN, 32)); 
    g.drawString("Hello",0,0);
    FontMetrics fm = g.getFontMetrics();
    g.translate(0, fm.getAscent());
    g.drawString("There",0,0);
    

    In your code you would need to do this before your looping.

    This further demonstrates using an increasing translate offset for y:

    String[] msgs = { "A", "B","C","D","E","F","G","H" };
    int cnt = 0;
    for (String s : msgs) {
        g.translate(0, (cnt * 2));
        cnt++;
        // moving x here for demo purposes - y is always 0 but translate moves it down
        g.drawString(s,(20*cnt),0);
    }
    

    and

    enter image description here