定时器延迟无法正常工作

时间:2016-05-01 14:43:09

标签: java graphics timer delay

EDITTED POST:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Examp{
JFrame field;
JPanel squares[][] = new JPanel[10][6];

public Examp(){
    field = new JFrame("Football Game");
    field.setSize(600, 800);
    field.setLayout(new GridLayout(10, 6));

    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 6; j++)
        {
            squares[i][j] = new JPanel();
            if (j == 2 || j == 3)
            {
                if (i == 0)
                    squares[i][j].setBackground(Color.RED);
                else if (i == 9)
                    squares[i][j].setBackground(Color.BLUE);
                else
                    squares[i][j].setBackground(Color.GREEN);
            }
            else
            {
                squares[i][j].setBackground(Color.GREEN);
            }
            field.add(squares[i][j]);
        }
    }

    field.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    field.setVisible(true);
}

public void place(int i,int j){
    ImageIcon ballIcon = new ImageIcon("C:\\Users\\Pamvotis\\Desktop\\Project\\img\\icon.png");
    JLabel ball = new JLabel(ballIcon);
    squares[i][j].add(ball);

    field.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    field.setVisible(true);
}

public void clear(){
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 6; j++)
        {
            squares[i][j].removeAll();
        }
    }
    field.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    field.setVisible(true);
}

public static void main(String[] args){
    Examp football = new Examp();
    football.place(2,3);
    Timer timer = new Timer(1000, new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
          football.clear();
          System.out.println("happened");
        }
    });
  timer.setRepeats(false);
  timer.start();

}

}

所以我编辑并尝试简化代码,以便您能够更好地了解我的要求,我之前为此道歉。

基本上我想要的是在1秒后从所有图标中清除该字段(我想制作一个足球游戏,所以我正在使用它来查看它如何在更大的范围内工作,我将在每轮后删除所有内容添加新职位)。我的问题是,当它在Timer中时,方法clear()似乎没有被执行(如果我在外面执行它就会被执行得很好)。我的System.out.println(...)在Timer中执行得很好,并且有适当的延迟,所以我真的不知道问题是什么。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

clear(...)方法实际上很可能已被执行,如果你在其中放入println,你肯定会知道。问题是,它是在正确的对象上执行的吗?

我猜你的Game类有自己的Graphics对象(因为它与java.awt.Graphics类直接冲突,所以它是一个可怕的类名,而那个需要更改状态的那个。)可能的解决方案是给Game一个允许外部类改变其状态的方法。

为了获得更好的答案,请发布一个更具信息量的问题,一个代码更相关的问题。

答案 1 :(得分:0)

也许更好的是使字段int计数器expample int counter = 1;并且在计时器任务中你可以减1计数器。所以计数器将有新的值0.在你需要的地方,你可以检查计数器是否有值0如果是,你可以调用你的方法football.clear();

更新:

   public int counter=1;

   *********

   Timer timer = new Timer(1000, new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent e) {
         counter--;
     }
   });
 timer.start();
}

***********

if(counter==1){
  football.clear();
  System.out.println("happened");
}