2012-04-25 23 views
0

開始停止とリセットボタンで簡単なタイマーを作成しようとしています。私はスレッドとアクションリスナーを使うのが初めてです。私はこれが働いて、私のタイマーを開始することができますし、私のボタンは、テキストを最初から停止するように変更することができます。しかしその後、私は立ち往生しています。私はタイマーを停止し、私がスタートボタンを押すと、それを再開する必要があります。その後、リセットするとゼロに戻ります。私はjava.util.Timerを使用したくない、私はちょうどスレッドを使用したい。一度スレッドを開始し、一時停止してから再開する方法私は組み込みのメソッドを使ってみましたが、コンパイルするのに手間がかかりませんでした。スレッド-JButtonアライメントの開始と停止

import javax.swing.*; 
import java.awt.Font; 
import java.lang.String; 
import java.awt.*; 

public class Timer extends JPanel { 

    // Here are the fields from below! 

    private static JLabel label = new JLabel(" 0.00 seconds"); 
    private static javax.swing.JButton start = new javax.swing.JButton("Start"); 
    private static javax.swing.JButton reset = new javax.swing.JButton("reset"); 

    /** 
    * Here is the Timer method- Begins with JLabel with medium alignment. 
    */ 
    public Timer() { 
    //new Thread(this).start(); 
    //label = new JLabel(" 0.00 Seconds"); 
    //this.label = label; 
    reset(); 
    } 


    /** 
    * Here is the Reset method- pressing this button from below will 
    * stop the thread and reset the text. 
    */ 
    public static void reset() { 
    label.setFont(new Font("Arial",Font.BOLD,36)); 
    label.setText(" 0.00 Seconds"); 

    } 

    public static void startStop() { 
    //start.setText("stop"); 
    //validate(); 

    } 

    public static void countDown() { 
    int Msec=0,min=0,sec=0; 
    while(sec < 60) { 
      label.setText(min+":"+sec+":"+Msec); 
      //label.setLayout(new BorderLayout.CENTER); 
      //label. 
      Msec++; 
      if(Msec==60) { 
      Msec=0; 
      sec++; 
      //label.setText(min+":"+sec+":"+Msec); 
      } 
      if(sec ==60) { 
      Msec =0; 
      sec = 0; 
      min++; 
      } 
      try 
     { 
      Thread.sleep(10); 
     } 
     catch(Exception e) 
     {} 
     } 
    }  

public static void main(String [] args) { 

    // we need a JFrame to put these elements into 
    javax.swing.JFrame win = new javax.swing.JFrame("Timer"); 
    // here we are instantating a new timer 
    final Timer time = new Timer(); 

    //Annonymous inner class 
    start.addActionListener(new java.awt.event.ActionListener() { 
    // here is the action performed method to start this. 
    public void actionPerformed(java.awt.event.ActionEvent e) { 
     //here we are creating a new thread to run throwable 
     // every click creates a new Thread (so it goes faster) 
     String text = (String)e.getActionCommand(); 
     if (text.equals("Start")){ 
     start.setText("Stop"); 
     } 
     else{ 
     start.setText("Start"); 
     } 
     Thread restart = new Thread(new Runnable() { 
     public void run() { 
      countDown(); 
      //startStop(); 
     } 

     }); 
     restart.start(); 
    } 
    }); 


    //Look at the below abstract actionlistener below to get reset to work 
    javax.swing.JButton reset = new javax.swing.JButton("reset"); 

    // here we are creating a new annonomys inner class.... check the 
    // curly braces 
    reset.addActionListener(new java.awt.event.ActionListener() { 
    public void actionPerformed(java.awt.event.ActionEvent e) { 
     Thread restart = new Thread(new Runnable() { 
     public void run() { 
      reset(); 
      //Thread.stop(); 
     } 

     }); 
     restart.destroy(); 
    } 
    }); 


    //label.setVisible(true); 

    javax.swing.JPanel tb = new javax.swing.JPanel(); 
    tb.add(reset); 
    tb.add(start); 
    //tb.add(circle); 
    win.add(tb,java.awt.BorderLayout.NORTH); 
    win.setSize(300,300); 
    //win.add(tb); 
    win.add(label,java.awt.BorderLayout.CENTER); 

    win.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE); 
    // hiding inside setVisible is borderLayout 
    win.setVisible(true); 
} 
} 
+0

*「ActiveListeners ..を使用するのは初めてです」*これは何ですか?大きな耳と注意力のある人は? –

+0

"lol" actionListeners .... –

+0

まだ行っていない場合は、[スレッドとスイング](http://java.sun.com/products/jfc/tsc/articles/threads/threads1)を読んでください。 html)と[Concurrency in Swing](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html)を参照してください。 –

答えて

1

スレッドで練習して改善したいというのはすばらしい目標ですが、これは本当にそれのためのアリーナではありません。問題は、Swingがシングルスレッドであることです.uiスレッドのみがグラフィカル環境を更新する必要があります。

グラフィックを含む操作を行う場合は、スレッドセーフであるため、javax.swing.Timerおよびjavax.swing.SwingWorkerを使用する必要があります。 1つの方法では、ここでスレッドの安全性について学んでいるので、進歩しています!

+0

さて、これをjavax.swing.Timerを使って動作させてみましょう。java.util.timerを使いたくなかったのですが、javax.swing.timerがあったことに気づいていませんでした。 –

関連する問題