GridLayout 为 `new GridLayout(22,1)` 显示 2 行

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

我正在尝试为游戏 (Yahtzee) 创建一个得分面板。得分面板必须由每个玩家的 22 行和 1 列组成,但我正在编写的以下代码为每个玩家显示 12 行和 2 列。

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

您的 createScorePanel() 方法确实添加了太多 Jlabel,因为您在创建播放器标签之一时确实添加了其中两个。这是更正后的版本:

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

编辑:我修复的是在内部 for 循环中添加一个 else 子句,以确保只有在满足其他条件 none 时才执行之前未受保护的代码。