Pergunta

Dentro deste programa, é preciso criar uma rede de 8x8 com widgets "LifeCell". O instrutor não mencionou que os widgets tinha que ser um objeto de Shape então eu fui em frente e usou a classe GridLayout. A classe GridLayout funciona bem (assim como eu sei, já que não há ajuda visual para confirmar.) O objetivo do programa é jogar o jogo da vida, onde um usuário pode clicar em um dos widgets LifeCell e alternar entre os estados sendo 'vivo' ou 'morto.

A minha pergunta depende fortemente de obter as células para ser pintado. Poderia ser um problema com meu código, mas não estou 100% de certeza.

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

e aqui é o método 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);
   }

Eu não preciso a solução exata para corrigi-lo, mas eu estou no juízo final tentando fazê-lo funcionar.

Graças.

EDIT:

Eu adicionei mais segmento da classe Program2.java, eu posso verificar amanhã de volta Eu estou indo para a cama, eu aprecio todos os caras de ajuda.

EDIT # 2:

A minha verdadeira confusão começa quando eu preencher meu quadro com uma GridLayout 8x8 cada "célula" indivíduo por falta de melhores palavras é do tipo LifeCell. Como posso pintar cada LifeCell diferentes cores? Se isso faz algum sentido em tudo para vocês, eu posso tentar revê-lo tanto quanto eu puder. E camickr, vou olhar para o site, obrigado.

Atribuição pode ser encontrada aqui para evitar toda e qualquer confusão sobre a minha pergunta e / ou o trecho de código.

Foi útil?

Solução

text alt

Você está no caminho certo.

Se você quiser usar um componente existente (como um JPanel, JLabel, JButton etc) que é muito melhor que você honrar o que o componente já faz, e apenas parametrizar o que é necessário.

Assim, no seu caso, você está usando um JPanel, este (e outros JComponents) tem uma propriedade background que você pode mudar. Assim, em vez de tentar pintar o componente de sua auto (que é o que está falhando agora) apenas definir esse valor e deixar a pintura pintar em si.

Você pode adicionar um "getLifeColor" que retornam as cores diferentes, dependendo do estado da célula:

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

E, em seguida, apenas tem a célula pintar o fundo com esta cor:

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

Depois que você só tem que definir o estado da célula para ao vivo ou morto e o componente aparecerá com a cor correspondente:

text alt

Aqui está a curto auto-contido exemplo correto (SSCCE) do código que você postou + a cor ao vivo / morto uso. Eu acho que você pode continuar a partir daí.

Outras dicas

JPanel não tem tamanho preferencial ou conteúdo visível padrão. você precisa adicionar algum tipo de componente visível (por exemplo JLabel) ou dar-lhe um tamanho preferido.

Além disso, o layout deve funcionar se você configurá-lo da seguinte forma:

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

Por que você ainda tem um método paintComponent () para o seu LifeCell? Não há necessidade de fazer pintura personalizada. Você pode mudar a cor de qualquer componente do fundo usando:

setBackground( Color.BLUE ) 

Além de que sua pergunta não faz sentido para mim. Primeiro você indicar que você precisa usar um objeto Shape, mas eu não vejo um objeto qualquer forma no seu código, então por que você confundir a questão ao mencionar que?

Eu realmente não entendo a sua pergunta e não temos o suficiente de seu código para fornecer todas as sugestões reais.

Se precisar de mais ajuda pós seu SSCCE mostrando o problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top