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)使用逻辑一致的缩进形式缩进代码行和代码块。缩进旨在使代码流更易于遵循!