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.