Search code examples
javaswinglayoutlayout-managergrid-layout

GridLayout Displaying 2 rows for `new GridLayout(22,1)`


I am trying to create a scorePanel for a game (Yahtzee). The scorepanel must consists of 22 rows and 1 column for each player but the following code i am writing displays 12 rows and 2 columns for each player.

import javax.swing.*;
import javax.swing.border.MatteBorder;
import java.awt.*;

public class PanelTest {

    private final String player1 = "krishna";
    private final String player2 = "Suresh";

    public PanelTest(){

        JFrame gameWindow = new JFrame("Play Game");
        gameWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel gamePanel = new JPanel();
        gamePanel.setLayout(new GridLayout(1,2));

/************ Scorepannel Creation starts here********************/

        JPanel scorePanel;
        scorePanel = createScorePanel();

/***************** Scorepanel Creation Ends Here*****************/

        //adding scorePanel to gamePanel
        scorePanel.setSize(500,540);
        gamePanel.add(scorePanel, BorderLayout.WEST);

        //adding gamePanel to gameWindow
        gameWindow.add(gamePanel);

        gameWindow.setSize(1000, 540);
        gameWindow.setVisible(true);
    }

    public JPanel createScorePanel(){

        JPanel scorePanel = new JPanel();

        JPanel[] columns;
        columns = new JPanel[3];

        JLabel[] player1score;
        player1score = new JLabel[22];

        JLabel[] playerNames;
        playerNames = new JLabel[2];

        playerNames[0] = new JLabel(player1);
        playerNames[1] = new JLabel(player2);

        columns[0] = new JPanel();
        columns[0].setSize(200, 540);
        columns[0].setLayout(new GridLayout(22,0));

        for (int count = 1; count <= (playerNames.length) ; count++ ){
            columns[count] = new JPanel();
            columns[count].setSize(150,540);
            columns[count].setLayout(new GridLayout(22,1));

            for (int i = 0; i < player1score.length; i++){
                if(count == 1 && i == 0){
                    player1score[i] = new JLabel(player1);
                    player1score[i].setBorder(new MatteBorder(1, 1, 1, 1, Color.GREEN));
                    columns[count].add(player1score[i]);
                }

                if (count == 2 && i == 0){
                    player1score[i] = new JLabel(player2);
                    player1score[i].setBorder(new MatteBorder(1, 1, 1, 1, Color.GREEN));
                    columns[count].add(player1score[i]);
                }

                player1score[i] = new JLabel();
                player1score[i].setBorder(new MatteBorder(1, 1, 1, 1, Color.BLACK));
                columns[count].add(player1score[i]);
            }

            scorePanel.add(columns[count]);
        }


        return scorePanel;
    }

    public static void main(String[] args) {
        new PanelTest();
    }
}

Solution

  • Your createScorePanel() method did add too many Jlabels because you did add two of these when one of the player labels was created. Here is the corrected version:

    public JPanel createScorePanel(){
    
        JPanel scorePanel = new JPanel();
    
        JPanel[] columns;
        columns = new JPanel[3];
    
        JLabel[] player1score;
        player1score = new JLabel[22];
    
        JLabel[] playerNames;
        playerNames = new JLabel[2];
    
        playerNames[0] = new JLabel(player1);
        playerNames[1] = new JLabel(player2);
    
        columns[0] = new JPanel();
        columns[0].setSize(200, 540);
        columns[0].setLayout(new GridLayout(22,0));
    
        for (int count = 1; count <= (playerNames.length) ; count++ ){
            columns[count] = new JPanel();
            columns[count].setSize(150,540);
            columns[count].setLayout(new GridLayout(22,1));
    
            for (int i = 0; i < player1score.length; i++){
                if (count == 1 && i == 0) {
                    player1score[i] = new JLabel(player1);
                    player1score[i].setBorder(new MatteBorder(1, 1, 1, 1, Color.GREEN));
                    columns[count].add(player1score[i]);
                }
                else if (count == 2 && i == 0) {
                    player1score[i] = new JLabel(player2);
                    player1score[i].setBorder(new MatteBorder(1, 1, 1, 1, Color.GREEN));
                    columns[count].add(player1score[i]);
                }
                else {
                    player1score[i] = new JLabel();
                    player1score[i].setBorder(new MatteBorder(1, 1, 1, 1, Color.BLACK));
                    columns[count].add(player1score[i]);
                }
            }
            scorePanel.add(columns[count]);
        }
        return scorePanel;
    }
    

    Edit: What I fixed was to add a else clause in the inner for loop to make sure that the previously unguarded code is only executed when none of the other conditions fits.