我正在制作一个只在我的JPanel上绘制一个tilemap的小程序,但是当我运行程序时,它会绘制地图,但它会绘制两次,当我最大化窗口时,一切都会消失。
这是我的代码:
package main;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
public class Board extends JPanel{
int width = 10;
int height = 10;
int size = 30;
int x;
int y;
int[][] map = map1.map;
ArrayList<Tile> tiles = new ArrayList<Tile>();
public Board(){
loadMap();
Thread t = new Thread(){
public void run(){
while(1 != 0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
repaint();
}
}
};
t.start();
}
public void loadMap(){
int x = 0;
int y = 0;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int tex = map[i][j];
Tile t = new Tile(x,y,tex);
tiles.add(t);
x+= size;
}
y += size;
}
}
public void drawMap(Graphics g){
int index = 0;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
Tile t = tiles.get(index);
if(t.tex == 0)
g.setColor(Color.gray);
else if(t.tex == 1)
g.setColor(Color.magenta);
g.fillRect(x,y,size,size);
index++;
x += size;
}
x = 0;
y += size;
}
}
public void paint(Graphics g){
drawMap(g);
}
public static void main(String[] args){
JFrame j = new JFrame();
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
j.setVisible(true);
j.add(new Board());
j.setSize(600,600);
j.setLocationRelativeTo(null);
}
}
我的tile类和map类是自解释的,Tile类只包含几个变量x,y,而map中只有一个数组[] [],而这些似乎不是问题。
它以我想要的方式打印地图,但是它下面有一个克隆,当我调整窗口大小时,一切都消失了。我不知道为什么会这样做,任何帮助都会受到赞赏。
由于
答案 0 :(得分:0)
没有运行代码:
你正在破坏油漆链。但是不要调用super.paint
你不允许组件为绘画做好准备。绘画是一系列复杂的链式方法调用,它们共同产生所需的输出,除非你准备接管这项工作,否则你必须先调用super.xxx
。
通常建议您覆盖paintComponent
代替,原因很简单,其中一个您刚刚发现......
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
drawMap(g);
}
有关如何在Swing中进行绘制的详细信息,请参阅Painting in AWT and Swing和Performing Custom Painting
您的drawMap
方法依赖于实例字段来绘制网格,这意味着每次调用该方法时,y
(特别是)的值都与它们时的值相同方法最后退出......
没有没有真正的理由他们应该是实例字段,他们只有drawMap
方法中的上下文......
public void drawMap(Graphics g) {
int x = 0;
int y = 0;
int index = 0;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
Tile t = tiles.get(index);
if (t.tex == 0) {
g.setColor(Color.gray);
} else if (t.tex == 1) {
g.setColor(Color.magenta);
}
g.fillRect(x, y, size, size);
index++;
x += size;
}
x = 0;
y += size;
}
}