编辑后的帖子:
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秒后清除球场上的所有图标(我想制作一个足球游戏,所以我用这个来看看它在更大的范围内如何工作,我会在每轮比赛后删除所有图标来添加新位置)。我的问题是,当方法clear()在Timer中时,它似乎不会被执行(如果我在外面执行它,它会被执行得很好)。我的System.out.println(…)在定时器中执行得很好,有适当的延迟,所以我真的不知道问题出在哪里。有人能帮我吗?
clear(...)
方法实际上很可能已经执行,如果您在其中放入println,您肯定会知道。问题是,它是否在正确的对象上执行?
我猜你的Game类有自己的Graphics对象(顺便说一句,这是一个可怕的类名,因为它与java.awt.Graphics
类直接冲突,而这正是需要更改其状态的对象。一个可能的解决方案是给Game一个允许外部类更改其状态的方法。
不过,为了获得更好的答案,请发布一个内容更丰富的问题,一个带有更相关代码的问题。
也许最好是使字段int counter 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");
}