2016-05-08 14 views
1

私はJlabelを追加して、私のプログラムでelpasedの時間を表示しようとしていますが、どこに置くべきか、そして追加する方法は分かりません。私が見つけたコードの1つを使ってみましたが、プログラムがハングしました。あなたが私を助けることを願って:時間が経過したキャンバスJava

はここに私のコードの要点だ、私は私のGUIのための2つの別々のJavaファイル

public class MyFrame extends JFrame implements Serializable,ActionListener{ 
    Canvas canvas; 
    CanvasManager manager; 

    public MyFrame() { 
     canvas = new Canvas(); 
     canvas.setSize(600,700); 
     this.add(canvas); 
     canvas.setBackground(Color.green); 

     this.pack(); 
     this.setVisible(true); 
     this.setResizable(false); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     manager = new CanvasManager(canvas); 
     manager.start(); 
    } 

を持っている、これは私が私の画像を描く私のキャンバスです:

public class CanvasManager extends Thread implements MouseListener, Serializable{ 
    private final int FRAME_DELAY = 200; // 20ms. implies 50fps (1000/20) = 50 

    private BufferedImage img; 
    private boolean toggle = true; 
    private int width = 600; 
    private int height = 700; 

    private Canvas canvas; 
    private long start; 

    public CanvasManager(Canvas canvas) { 
     this.canvas = canvas; 
     this.canvas.setSize(width, height); 
     this.canvas.addMouseListener(this); 
    } 

    public void run() { 
     start = System.currentTimeMillis(); 
     canvas.createBufferStrategy(2); 
     BufferStrategy strategy = canvas.getBufferStrategy(); 
     Graphics g = null; 
     while (true) { 
      g = strategy.getDrawGraphics(); 
      paint(g); 
      strategy.show(); 
      syncFramerate(); 
     } 
    } 

私のプログラムはキャンバスを再ペイントし続ける必要があるので、私は自分のペイント関数用のスレッドを持っています。

答えて

0

解決策は、フレームを拡張するクラスにJlabelを追加することです。その後

JLabel lbl = new JLabel("Text"); // instance variable 
this.add(lbl); // this should go in constructor 

時間が経過するにつれて、あなたはその後、あなたのゲームループにあなたはタイマ/スイングタイマーを開始しますJLabelの

lbl.setText("Time"); 

内のテキストを更新したときに、時間のJLabelのテキストを変更しますアクションは、次に呼び出す...

Timer timer = new Timer(1000, new ActionListener() { //Change parameters to your needs. 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       //setText of JLabel here every second/ 
      } 
     }); 

を解雇され

timer.start(); 

あなたがプログラムの開始時にそれを望むと思う経過時間の計算を開始したいときは、私はこのタイマーがまだ起動されていなければgameLoopでこのメソッドを呼び出します。

相続人API:

https://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html

+0

こんにちは、私はすでに私はちょうどそれの内側にタイマーを追加する必要がありますアクションリスナーを持っていますか? –

+0

@XaelYvetteもしそうなら、答えはYesです。タイマーにactionlistenerを追加する – DarkV1

+0

いいえ、それは私のメニューバーです –

関連する問題