简体   繁体   中英

PaintComponent doesn't paint the tiles or draws the strings

I wrote some code for my school project to create a grid of 10 x 10 using a 2d array and the function paintcomponent.

My problem is that it doesn't show the grid or shows the strings. (The compiler doesn't show any errors.)

Here's my code:

Board.java

public class Board extends JComponent implements KeyListener{

    public Board() {

    }

    public static String[] gameElements = new String[100];


    private String[][] map = new String[10][10];
    private String currentLevel = "1";
    private boolean paintComponentExecuted = false;
    Player hero;


    @Override
    public void paintComponent(Graphics g) {
        if(paintComponentExecuted == false) {
            loadLevel();
            int i = 0;
            int positionX = 50;
            int positionY = 50;
            for (int y = 0; y < map.length; y++) {
                for (int x = 0; x < map.length; x++) {
                    new Tile(x, y).paintComponent(g);
                    g.drawString(gameElements[i], positionY, positionX);
                    map[y][x] = gameElements[i];
                    positionY += 50;
                    System.out.print("[" + map[y][x] + "]");
                    i++;
                }
                positionY = 50;
                positionX += 50;
                System.out.println();
                paintComponentExecuted = true;

            }
        }
    }

    public void readTextFile(String fileName) {
        try {
            FileReader fileReader = new FileReader(fileName + ".txt");
            BufferedReader buffer = new BufferedReader(fileReader);
            String splitBy = ",";
            String line = buffer.readLine();

            for (int i = 0; i < gameElements.length; i++) {
                gameElements = line.split(splitBy);
            }

        } catch (FileNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void loadLevel() {
        readTextFile(currentLevel);
    }

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setSize(600, 600);
        frame.setTitle("SleutelBarricade");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JComponent chart = new Board();
        frame.add(chart);

        frame.setVisible(true);


    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

Tile.java

public class Tile extends Board {

    public Tile() {

    }

    final private static int CELL_WIDTH = 50;
    final private static int CELL_HEIGHT = 50;

    final private static int BOARD_X_OFFSET = 25;
    final private static int BOARD_Y_OFFSET = 25;

    private int x;
    private int y;

    private int getScreenX(int x, int y) {
        return BOARD_X_OFFSET + x * CELL_WIDTH;
    }

    private int getScreenY(int x, int y) {
        return BOARD_Y_OFFSET + y * CELL_HEIGHT;
    }

    public Tile(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(Color.BLACK);
        g.drawRect(
                getScreenX(x, y),
                getScreenY(x, y),
                CELL_WIDTH,
                CELL_HEIGHT);

    }

}

Thanks in advance!

You have to remove this condition:

if(paintComponentExecuted == false) {


  paintComponentExecuted = true;
}

Leave the rest of the content of that block there. Don't block paint to repaint; otherwise you see it once and never again.

You need to create the tiles in the constructor:

Supposing you have this global variable

Tile tiles=new Tile[10][10];

then in the constructor

   for (int y = 0; y < tiles[0].length; y++)
      for (int x = 0; x < tiles.length; x++)
        tiles[x][y]=new Tile(x, y);

then in paintComponent you call

tiles[x][y].paintComponent(g);

Also Tile should better not extend anything just be itself since you are drawing on the Board. Maybe some of this will help.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM