Domanda

All'interno di questo programma, dobbiamo creare una griglia 8x8 di " LifeCell " widgets. L'istruttore non ha menzionato che i widget dovevano essere un oggetto di Shape , quindi sono andato avanti e ho usato la classe GridLayout . La classe GridLayout funziona bene (come noto, poiché non esiste alcun aiuto visivo per confermare.) L'oggetto del programma è giocare a Game of Life in cui un utente può fare clic su uno dei Widget LifeCell e alternare tra stati "vivi" o "morti".

La mia domanda si basa molto sul far dipingere le celle. Potrebbe essere un problema con il mio codice, ma non sono sicuro al 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);
   }   

ed ecco il metodo 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);
   }

Non ho bisogno della soluzione esatta per risolverlo, ma sono alla fine cercando di farlo funzionare.

Grazie.

EDIT:

Ho aggiunto un altro segmento della classe Program2.java, posso controllare domani, vado a letto, apprezzo tutto l'aiuto ragazzi.

EDIT # 2:

La mia vera confusione arriva quando popolo il mio frame con un GridLayout 8x8 per ogni singolo "cella". per mancanza di parole migliori è di tipo LifeCell . Come posso dipingere ogni LifeCell colori diversi? Se questo ha un senso per voi ragazzi, posso provare a rivederlo il più possibile. E camickr, guarderò quel sito, grazie.

L'assegnazione può essere trovata qui per evitare qualsiasi confusione per quanto riguarda la mia domanda e / o lo snippet di codice.

È stato utile?

Soluzione

 alt text

Sei sulla strada giusta.

Se si desidera utilizzare un componente esistente (come JPanel, JLabel, JButton ecc.) è molto meglio onorare ciò che fa già il componente e parametrizzare ciò che è necessario.

Quindi nel tuo caso stai usando un JPanel, questo (e altri JComponents) hanno una proprietà background che puoi cambiare. Quindi, invece di provare a dipingere te stesso il componente (che è ciò che sta fallendo in questo momento) basta impostare quel valore e lasciare che la vernice dipinga da sola.

Puoi aggiungere un " getLifeColor " che restituiscono colori diversi a seconda dello stato della cella:

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

E poi basta che la cella dipinga lo sfondo con questo colore:

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

Dopo di che devi solo impostare lo stato della cella su vivo o morto e il componente apparirà con il colore corrispondente:

 alt text

Ecco il breve esempio corretto e autonomo (SSCCE) del codice che hai pubblicato + il colore vivo / morto utilizzo. Penso che tu possa continuare da lì.

Altri suggerimenti

JPanel non ha dimensioni preferite predefinite o contenuti visibili. dovrai aggiungere una sorta di componente visibile (ad esempio JLabel) o dargli una dimensione preferita.

oltre a questo, il layout dovrebbe funzionare se lo hai impostato come segue:

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

Perché hai persino un metodo paintComponent () per LifeCell? Non è necessario eseguire la pittura personalizzata. Puoi cambiare il colore di sfondo di qualsiasi componente usando:

setBackground( Color.BLUE ) 

A parte questo, la tua domanda non ha senso per me. Per prima cosa affermi che devi usare un oggetto Shape, ma non vedo un oggetto Shape da nessuna parte nel tuo codice, quindi perché hai confuso la domanda citandola?

Non capisco davvero la tua domanda e non abbiamo abbastanza codice per fornire suggerimenti reali.

Se hai bisogno di ulteriore assistenza, pubblica il tuo SSCCE che mostra il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top