Java Swing-列表在paintComponent方法中不起作用的问题
我试图在屏幕上呈现多个Java Swing-列表在paintComponent方法中不起作用的问题,java,swing,paint,Java,Swing,Paint,我试图在屏幕上呈现多个战斗机的位置。有关守则如下: public void run() { double ns = 1000000000.0 / tps; double delta = 0; int frames = 0; int updates = 0; long lastTime = System.nanoTime(); long timer = System.currentTimeMilli
战斗机的位置。有关守则如下:
public void run() {
double ns = 1000000000.0 / tps;
double delta = 0;
int frames = 0;
int updates = 0;
long lastTime = System.nanoTime();
long timer = System.currentTimeMillis();
while (running) {
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while(delta >= 1) {
update();
updates++;
delta--;
}
frame.getContentPane().repaint();
frames++;
if(System.currentTimeMillis() - timer >= 1000) {
timer += 1000;
frame.setTitle(title + " | " + updates + " ups, " + frames + " fps");
frames = 0;
updates = 0;
}
}
stop();
}
private void update() {
if (Math.random() < .1) {
Fighter newFighter = new Fighter();
fighterList.add(newFighter);
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g); // paint background
setBackground(Color.BLUE);
System.out.println(fighterList.size());
for (int i = 0; i<fighters; i++) {
System.out.println("Attempted");
g.setColor(Color.GREEN);
g.drawRect((int) fighterList.get(i).xPos,
(int) fighterList.get(i).yPos,
fighterList.get(i).radius,
fighterList.get(i).radius);
System.out.println("Rendered");
}
}
public static void main(String[] args) {
Game game = new Game();
game.frame.setContentPane(new Game());
game.frame.setResizable(false);
game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.frame.setLocationRelativeTo(null);
game.frame.setVisible(true);
game.start();
}
public void run(){
双ns=100000000.0/tps;
双增量=0;
int帧=0;
int=0;
long lastTime=System.nanoTime();
长定时器=System.currentTimeMillis();
(跑步时){
long now=System.nanoTime();
增量+=(现在-上次)/ns;
上次=现在;
而(增量>=1){
更新();
更新++;
三角洲--;
}
frame.getContentPane().repaint();
frames++;
if(System.currentTimeMillis()-计时器>=1000){
定时器+=1000;
frame.setTitle(title+“|”+更新+“ups”+“frames+“fps”);
帧=0;
更新=0;
}
}
停止();
}
私有void更新(){
if(Math.random()<.1){
战斗机新战斗机=新战斗机();
fighterList.add(新战斗机);
}
}
公共组件(图形g){
super.paintComponent(g);//绘制背景
挫折背景(颜色:蓝色);
System.out.println(fighterList.size());
对于(int i=0;i最有可能是同步问题。始终从EDT(事件调度线程)调用paintComponent()
方法,而run()
方法在其自己的单独线程中运行。这是调用update()
的地方,它会将新的Fighter
添加到列表中
您需要适当的同步,以便两个(或所有)线程都能看到相同的一致数据
此外,由于您的模型(数据)可能在重新绘制过程中被修改,您还应该“克隆”该模型,以避免绘制不一致的模型。或者,如果您不想克隆它,请同步对该模型的访问,以便在绘制时不能对其进行修改。1)“相关代码如下所示:“为了更快地获得更好的帮助,请发布(最小完整可验证示例)或(简短、自包含、正确示例)。2)使用逻辑一致的缩进形式缩进代码行和代码块。缩进旨在使代码流更易于遵循!