Question

Dans le cadre de ce programme, nous devons créer une grille 8 "x8" de "LifeCell". widgets. L'instructeur n'a pas mentionné le fait que les widgets devaient être un objet de Shape . J'ai donc décidé d'utiliser la classe GridLayout . La classe GridLayout fonctionne bien (comme je sais, car il n’existe aucune aide visuelle à confirmer.) Le but du programme est de jouer au jeu de la vie où un utilisateur peut cliquer sur l’une des Les widgets LifeCell et basculent entre les états "en vie" ou "morts".

Ma question repose beaucoup sur le fait de peindre les cellules. Cela pourrait être un problème avec mon code, mais je ne suis pas sûr à 100%.

Program2.java

public class Program2 extends JPanel implements ActionListener {
private LifeCell[][] board; // Board of life cells.
private JButton next; // Press for next generation.
private JFrame frame; // The program frame.

public Program2() {
    // The usual boilerplate constructor that pastes the main
    // panel into a frame and displays the frame. It should
    // invoke the "init" method before packing the frame
    frame = new JFrame("LIFECELL!");
    frame.setContentPane(this);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.init();
    frame.pack();
    frame.setVisible(true);
}
    public void init() {
    // Create the user interface on the main panel. Construct
    // the LifeCell widgets, add them to the panel, and store
    // them in the two-dimensional array "board". Create the
    // "next" button that will show the next generation.
    LifeCell[][] board = new LifeCell[8][8];
    this.setPreferredSize(new Dimension(600, 600));
    this.setBackground(Color.white);
    this.setLayout(new GridLayout(8, 8));
    // here is where I initialize the LifeCell widgets
    for (int u = 0; u < 8; u++) {
        for (int r = 0; r < 8; r++) {
            board[u][r] = new LifeCell(board, u, r);
            this.add(board[u][r]);
            this.setVisible(true);

        }
    }

LifeCell.java

 public class LifeCell extends JPanel implements MouseListener {
   private LifeCell[][] board; // A reference to the board array.
   private boolean alive;      // Stores the state of the cell.
   private int row, col;       // Position of the cell on the board.
   private int count;          // Stores number of living neighbors.

   public LifeCell(LifeCell[][] b, int r, int c) {
       // Initialize the life cell as dead.  Store the reference
       // to the board array and the board position passed as
       // arguments.  Initialize the neighbor count to zero.
       // Register the cell as listener to its own mouse events.
       this.board = b;
       this.row = r;
       this.col = c;
       this.alive = false;
       this.count = 0;
       addMouseListener(this);
   }   

et voici la méthode paintComponent :

   public void paintComponent(Graphics gr) {
       // Paint the cell.  The cell must be painted differently
       // when alive than when dead, so the user can clearly see
       // the state of the cell.
           Graphics2D g = (Graphics2D) gr;
           super.paintComponent(gr);
           g.setPaint(Color.BLUE);
   }

Je n’ai pas besoin de la solution exacte pour y remédier, mais j’ai du mal à essayer de la faire fonctionner.

Merci.

EDIT:

J'ai ajouté un segment supplémentaire de la classe Program2.java, je peux vérifier demain, je me dirige vers le lit, j'apprécie l'aide des gars.

EDIT n ° 2:

Ma vraie confusion vient lorsque je remplis mon cadre avec un GridLayout 8x8, chaque "cellule" & individu; faute de meilleurs mots, il est de type LifeCell . Comment puis-je peindre chaque LifeCell de couleurs différentes? Si cela vous semble logique, je peux essayer de le réviser autant que possible. Et camickr, je vais consulter ce site Web, merci.

L'assignation peut être trouvée ici pour éviter toute confusion. en ce qui concerne ma question et / ou l'extrait de code.

Était-ce utile?

La solution

 alt text

Vous êtes sur la bonne voie.

Si vous souhaitez utiliser un composant existant (tel que JPanel, JLabel, JButton, etc.), il est préférable de respecter ce que le composant fait déjà et de paramétrer ce qui est nécessaire.

Donc, dans votre cas, vous utilisez un JPanel, celui-ci (et d’autres JComponents) a une propriété background que vous pouvez modifier. Ainsi, au lieu d'essayer de peindre le composant vous-même (ce qui échoue pour le moment), définissez simplement cette valeur et laissez la peinture se peindre elle-même.

Vous pouvez ajouter un " getLifeColor " qui retournent des couleurs différentes en fonction de l'état de la cellule:

   private Color getLifeColor() {
       return this.alive?liveColor:deadColor;
   } 

Ensuite, la cellule peint l'arrière-plan avec cette couleur:

  public void paintComponent(Graphics gr) {
       setBackground( getLifeColor() );
       super.paintComponent( gr );
  }

Après cela, il vous suffit de définir l'état de la cellule sur vivant ou hors service et le composant apparaît avec la couleur correspondante:

 alt text

Voici l'exemple court correct et autonome (SSCCE) du code que vous avez publié + la couleur morte / en direct usage. Je pense que vous pouvez continuer à partir de là.

Autres conseils

JPanel n'a pas de taille préférée par défaut ni de contenu visible. vous devrez ajouter une sorte de composant visible (par exemple, JLabel) ou lui donner une taille préférée.

De plus, votre mise en page devrait fonctionner si vous l'avez configurée comme suit:

JFrame frame = new JFrame();
Container cp = frame.getContentPane();
cp.setLayout(new GridLayout(8, 8));
for (int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++)
        cp.add(new JLabel(i + "-" + j));
frame.pack();
frame.setVisible(true);

Pourquoi avez-vous même une méthode paintComponent () pour votre LifeCell? Il n'est pas nécessaire de faire de la peinture personnalisée. Vous pouvez modifier la couleur d'arrière-plan de n'importe quel composant en utilisant:

setBackground( Color.BLUE ) 

Sinon, votre question n'a aucun sens pour moi. Tout d'abord, vous indiquez que vous devez utiliser un objet Shape, mais je ne vois aucun objet Shape dans votre code, alors pourquoi avez-vous confondu la question en le mentionnant?

Je ne comprends vraiment pas votre question et nous n'avons pas assez de votre code pour fournir de véritables suggestions.

Si vous avez besoin d'aide supplémentaire, envoyez votre SSCCE présentant le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top