paintcomponent不是由构造函数调用的,也不是在创建对象时调用的

时间:2016-10-16 16:28:10

标签: java

我有两个类:GameOfLife()和PanelGrid。创建panelgrid的新对象时,不会调用(覆盖)方法paintComponent。在构造函数中放置“repaint()”也不起作用。

import java.util.Scanner;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

class GameOfLife {
    JFrame frame = new JFrame("Game of life");
    PanelGrid panelGrid;

    void buildIt() {
        frame.setSize(600, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setVisible(true);
        frame.add(buttonStart, BorderLayout.SOUTH);
        frame.add(buttonStop, BorderLayout.NORTH);
        panelGrid = new PanelGrid();
        panelGrid.setOpaque(true);
        frame.add(panelGrid);
    }

    public static void main(String[] args) {
        new GameOfLife().buildIt();
    }
}

class PanelGrid extends JPanel implements ActionListener {
    Timer timer;
    int delay;
    JLabel label;
    int height; // get length from the file
    int width; //get width of array from the file

    //constructor
    public PanelGrid() {
        delay = 1000;
        timer = new Timer(delay, this);
        width = 4;
        height = 5;
        //if there exists a file with an initial configuration, initial[][], width and height are updated.
        //if not, the default array is used
        readInitial();
        //repaint();  putting repaint() here din't make a difference.
    }

    @Override
    public void paintComponent(Graphics g) {
        System.out.println("if you read this, the method is called");
    super.paintComponent(g); //erases panel content
    this.setLayout(new GridLayout(width, height));
    for (int r = 0; r < height; r++) {
        for (int c = 0; c < width; c++) {
            JPanel panel = new JPanel();
            if (grid[r][c].isAlive() == true) {
                panel.setBackground(Color.BLACK);
            } else {                    
                panel.setBackground(Color.WHITE);
            }
            this.add(panel);
        }
    }
    //the rest of this class I have left out for clarity
    }
}

1 个答案:

答案 0 :(得分:0)

我认为您需要将PanelGrid添加到JFrame。如果它不在可见的顶级容器paint()中,因此paintComponent()不会被调用。也许。值得一试......