gpt4 book ai didi

java - 代码在我们没有要求的情况下运行多次

转载 作者:行者123 更新时间:2023-12-01 10:05:58 25 4
gpt4 key购买 nike

我们正在尝试使用二维数组用图 block 绘制棋盘,但每次运行代码时,它都会经过 PaintComponent 2 到 3 次(每次都不同),而我们只尝试遍历一次。

这是我们的代码

Board.java:

public class Board extends JComponent {

public Board() {

}

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


private String[][] map = new String[10][10];
private int positionX = 50;
private int positionY = 50;
private String currentLevel = "1";

public String[][] getMap(){
return map;
}

public void setMap(String[][] map){
this.map = map;
}

@Override
public void paintComponent(Graphics g) {
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);
map[y][x] = gameElements[i];
g.drawString(gameElements[i], positionY, positionX);
positionY += 50;
System.out.print("[" + map[y][x] + "]");
i++;
}
positionY = 50;
positionX += 50;
System.out.println();

}
}

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


}
}

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

}

结果:

"C:\Program Files\Java\jdk1.8.0_77\bin\java" -Didea.launcher.port=7537 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_77\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\rt.jar;C:\Users\Darryl Soerdjpal\Desktop\TestBoard\out\production\TestBoard;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain Main.GameBoard.Board
[E][W][B][E][E][E][E][B][B][B]
[E][E][E][E][K][K][E][B][B][B]
[E][E][B][E][E][E][E][B][B][K]
[E][W][B][E][E][E][E][B][B][B]
[E][W][B][B][W][W][W][B][B][B]
[E][B][B][E][E][E][W][B][B][E]
[E][W][B][W][W][B][W][W][E][E]
[E][W][B][B][B][B][E][E][E][E]
[K][W][B][B][E][E][E][W][E][E]
[E][W][B][B][E][E][E][W][E][F]
[E][W][B][E][E][E][E][B][B][B]
[E][E][E][E][K][K][E][B][B][B]
[E][E][B][E][E][E][E][B][B][K]
[E][W][B][E][E][E][E][B][B][B]
[E][W][B][B][W][W][W][B][B][B]
[E][B][B][E][E][E][W][B][B][E]
[E][W][B][W][W][B][W][W][E][E]
[E][W][B][B][B][B][E][E][E][E]
[K][W][B][B][E][E][E][W][E][E]
[E][W][B][B][E][E][E][W][E][F]

Process finished with exit code 0

最佳答案

您错误地使用了面向对象编程。 Tile 不应扩展 Board。其次,Tile 应该自行处理绘图。

此外,不要每次都创建新的 Tile 对象(每次调用 repaint() 时)。读取文件后创建一次。您的 gameElements 现在可以被消除,因为您可以在文件读取期间创建 Tile 数组。

注意:下面,我通过 InputStream (Eclipse IDE) 将文件加载到 Scanner 中:

ClassLoader loader = Board.class.getClassLoader();
String filename = "resources/" + level + ".txt";
InputStream stream = loader.getResourceAsStream(filename);
Scanner scan = new Scanner(stream);

相反,您可以将 File 直接加载到 Scanner 构造函数中:

String filename = "path/to/file/" + level + ".txt";
File file = new File(filename);
Scanner scan = new Scanner(file);
<小时/>

Main.java

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
JComponent chart = new Board("1");

frame.setSize(600, 600);
frame.setTitle("SleutelBarricade");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.add(chart);
frame.setVisible(true);
}
});
}
}

Board.java

import java.awt.Graphics;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JComponent;

public class Board extends JComponent {
private static final long serialVersionUID = 3669634976765884468L;

public String[] gameElements = new String[100];
private Tile[] tiles = new Tile[100];
private String[][] map = new String[10][10];
private String currentLevel;
private boolean isInitialized;

public Board(String level) {
isInitialized = false;

loadLevel(level);

currentLevel = level;
isInitialized = true;
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

if (isInitialized) {
int i = 0;

g.clearRect(0, 0, this.getWidth(), this.getHeight());

for (int y = 0; y < map.length; y++) {
for (int x = 0; x < map.length; x++) {
tiles[i].paintComponent(g);
map[y][x] = tiles[i].getLabel();
System.out.printf("[%s]", map[y][x]);
i++;
}

System.out.println();
}
}
}

public void readTextFile(String level) {
ClassLoader loader = Board.class.getClassLoader();
String filename = "resources/" + level + ".txt";
InputStream stream = null;
Scanner scan = null;

try {
stream = loader.getResourceAsStream(filename);
scan = new Scanner(stream);

scan.useDelimiter("[,]([\r\n]+)?");

int i = 0;
while (scan.hasNext()) {
gameElements[i] = scan.next().trim();
i++;
}

scan.close();
stream.close();
} catch (IOException e) {
Logger.getLogger(Board.class.getName()).log(Level.SEVERE, null, e);
}
}

private void generateTiles() {
int i = 0;
for (int y = 0; y < map.length; y++) {
for (int x = 0; x < map.length; x++) {
tiles[i] = new Tile(x, y, gameElements[i]);
i++;
}
}
}

public void loadLevel(String level) {
readTextFile(level);
generateTiles();
}
}

Tile.java

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;

public class 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 String label;

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}

public String getLabel() {
return label;
}

public void setLabel(String label) {
this.label = label;
}

public Tile() {
this(0, 0, "?");
}

public Tile(int x, int y, String label) {
this.x = getScreenX(x);
this.y = getScreenY(y);
this.label = label;
}

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

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

public void paintComponent(Graphics g) {
Font font = new Font("Arial", Font.BOLD, 16);
FontMetrics metrics = g.getFontMetrics(font);
int fontWidth = metrics.stringWidth(label);
int fontHeight = metrics.getHeight();

int xPos = x + BOARD_X_OFFSET - (fontWidth / 2);
int yPos = y + BOARD_Y_OFFSET + (fontHeight / 2);

g.setFont(font);
g.setColor(Color.BLACK);
g.drawRect(x, y, CELL_WIDTH, CELL_HEIGHT);
g.drawString(label, xPos, yPos);
}
}

1.txt

E,W,B,E,E,E,E,B,B,B,
E,E,E,E,K,K,E,B,B,B,
E,E,B,E,E,E,E,B,B,K,
E,W,B,E,E,E,E,B,B,B,
E,W,B,B,W,W,W,B,B,B,
E,B,B,E,E,E,W,B,B,E,
E,W,B,W,W,B,W,W,E,E,
E,W,B,B,B,B,E,E,E,E,
K,W,B,B,E,E,E,W,E,E,
E,W,B,B,E,E,E,W,E,F

关于java - 代码在我们没有要求的情况下运行多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36476457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com