2012-12-09 3 views
4

J'essaye de créer une carte de tic tac simple faite par 9x9 JButtons. J'ai utilisé un tableau 2d et un gridlayout mais le résultat n'est rien, un frame sans aucun bouton. Qu'est-ce que je fais mal?Ajouter des boutons en utilisant gridlayout

import java.awt.GridLayout; 
import javax.swing.*; 


public class Main extends JFrame 
{ 
    private JPanel panel; 
    private JButton[][]buttons; 
    private final int SIZE = 9; 
    private GridLayout experimentLayout; 
    public Main() 
    { 
     super("Tic Tac Toe"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(500,500); 
     setResizable(false); 
     setLocationRelativeTo(null); 

     experimentLayout = new GridLayout(SIZE,SIZE); 

     panel = new JPanel(); 
     panel.setLayout(experimentLayout); 


     buttons = new JButton[SIZE][SIZE]; 
     addButtons(); 


     add(panel); 
     setVisible(true); 
    } 
    public void addButtons() 
    { 
     for(int k=0;k<SIZE;k++) 
      for(int j=0;j<SIZE;j++) 
      { 
       buttons[k][j] = new JButton(k+1+", "+(j+1)); 
       experimentLayout.addLayoutComponent("testName", buttons[k][j]); 
      } 

    } 


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

    } 

} 

** La méthode addButton ajoute les boutons au tableau et directement au panneau.

Merci à l'avance.

Répondre

8

Vous devez ajouter les boutons à votre JPanel:

public void addButtons(JPanel panel) { 
    for (int k = 0; k < SIZE; k++) { 
     for (int j = 0; j < SIZE; j++) { 
     buttons[k][j] = new JButton(k + 1 + ", " + (j + 1)); 
     panel.add(buttons[k][j]); 
     } 
    } 
} 
4
// add buttons to the panel INSTEAD of the layout 
// experimentLayout.addLayoutComponent("testName", buttons[k][j]); 
panel.add(buttons[k][j]); 

D'autres conseils:

  1. Ne prolongez pas JFrame, juste garder une référence à un aussi longtemps que nécessaire. N'augmentez le cadre que lorsque vous ajoutez ou modifiez des fonctionnalités.
  2. Au lieu de setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);, utilisez setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); comme dans this answer.
  3. Au lieu de setSize(500,500);, utilisez panel.setPreferredSize(new Dimension(500,500));. Ou mieux encore, étendez JButton pour obtenir un SquareButton qui renvoie une taille préférée égale au plus grand choix de largeur ou de hauteur. Le dernier assurera que l'interface utilisateur graphique est la taille dont il a besoin, carré & permettant suffisamment d'espace pour afficher le texte.
  4. Au lieu de setLocationRelativeTo(null); utilisation setLocationByPlatform(true); comme on le voit dans la réponse liée au point 2.
  5. Ajouter pack() avant setVisible(true); qui assure l'interface graphique est la taille, il doit être, pour afficher le contenu.
  6. Au lieu de setResizable(false) appel setMinimumSize(getSize()).
  7. Démarrez & mettre à jour l'interface graphique sur l'EDT. Voir Concurrency in Swing pour plus de détails.
+1

Merci beaucoup pour ces conseils! J'ai toujours confondu entre setsize et preferredsize et les autres choses que vous avez mentionnées et je ne savais pas quoi utiliser. Merci encore! –

Questions connexes