2016-05-01 15 views
-1

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秒後にすべてのアイコンからフィールドをクリアすることです(私はフットボールの試合をしたいので、これを使って、丸めて新しい位置を追加する)。私の問題は、メソッドclear()がTimerにあるときに実行されないように見えるということです(それを外で実行するとうまく実行されます)。私のSystem.out.println(...)は、適切な遅延でタイマーで正常に実行されます。したがって、問題が何であるか実際にはわかりません。誰でも助けてくれますか?

+0

? – DarkV1

+0

アクションはいつ解雇されますか?または一定の時間に達したら? – DarkV1

+0

より良いヘルプを得るには、有効な[mcve]を作成して投稿してください。投稿する前にリンクをお読みください。 –

答えて

1

実際にはclear(...)メソッドが実行されている可能性が高く、printlnをその中に入れると確実にわかります。質問は、それが正しいオブジェクトで実行されているかどうかです。

あなたのGameクラスには独自のGraphicsオブジェクトがあります(それはjava.awt.Graphicsクラスと直接衝突するので、ひどいクラス名です。その状態を変更する必要があります)。ゲームに外部のクラスにその状態を変更することができる方法を提供する。より良い回答については

はいえ、より良い、より有益な質問、より適切なコードを持つものを投稿してください。

+0

私はクリアされていますそれとprintlnを置くと動作しますが、私はなぜサッカー場が消えてしまうのか理解できません。私は私の質問を更新しました。あなたのために良いことを望んでいます。前に行方不明の情報をご迷惑をおかけして申し訳ありません。 – helpme

0

たぶん、より良いが作られたフィールドにありますint counter expample int counter = 1;そしてtimerタスクでは、カウンタを1減らすことができるので、カウンタは新しい値0を持ちます。あなたがあなたのメソッドfootball.clear()を呼び出すことができるならば、カウンタは値0を持っています;

更新:サッカーのフィールドをクリアしなければならない

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"); 
} 
+0

私はそれを試みましたが、コンパイラはカウンタが最終でなければならないと言いました。後に0に... – helpme

+0

これは最終的なものであるため変更できません。 – GlacialMan

+0

私は変数を静的なものにしていましたが、現時点ではまだフィールドが変更されていません。理由はわかりません。メソッドを呼び出すときに問題はありますか? – helpme