2017-07-03 17 views
2

Ich versuche ein ScorePanel für ein Spiel (Yahtzee) zu erstellen. Das Scorepanel muss aus 22 Reihen und 1 Spalte für jeden Spieler bestehen, aber der folgende Code, den ich schreibe, zeigt 12 Reihen und 2 Spalten für jeden Spieler.GridLayout Anzeige von 2 Zeilen für `new GridLayout (22,1)`

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

Nur ein freundlicher Tipp: Ich empfehle die Verwendung von JavaFX und Scene Builder, da es viel einfacher ist, das Layout zu bestimmen, dann ist es so programmiert, und es ist auch sehr überschaubar! :) – ZeldaZach

Antwort

2

Ihre createScorePanel() Methode hat zu viele Jlabel s hinzufügen, weil Sie zwei davon taten hinzufügen, wenn einer der Spieler Etiketten erstellt wurde. Hier ist die korrigierte 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: Was ich festgelegt war eine else-Klausel in den inneren for-Schleife hinzufügen, um sicherzustellen, dass der zuvor unbewacht Code nur dann ausgeführt wird, wenn keine der anderen Bedingungen paßt.

+0

Sie sollten besser erklären, was Sie behoben haben, aber es ist richtig. +1 :) – CodingNinja