2012-03-17 16 views
3

単純なラベルとボタンの2つの要素しか持たない単純なGUIフォームを作成しようとしています。ボタンに表示されるテキストは「開始」です。ラベルはデフォルトで0を表示しています。私はアクションを起こさなければなら以下のボタンを開始]をクリックするとJava - Swingで作成されたGUIの更新

  1. をカウンターは、1秒ごとに0から1ずつ増加スタートします。
  2. [スタート]ボタンに表示されるテキストは[停止]に変わります。
  3. もう一度同じボタンをクリックすると(キャプションが停止として表示されます)、インクリメントが停止します。
  4. ボタン上のテキストが「開始」に変わります。それで...

私はNetbeansで自分のアプリケーションを開発しています。

上の図に示すように、2つの.javaファイルがAGC.javaの

内容がありますが、次のとおりです。Main.javaの

public class AGC extends javax.swing.JFrame 
{ 
    public AGC() 
    {  
     initComponents(); 
    } 

    public static void main(String args[]) 
    { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() 
      { 
       new AGC().setVisible(true); 
      } 
     }); 
    } 

    private javax.swing.JButton btnStartStop; // name of start stop button 
    private javax.swing.JLabel lblCounter; // name of the label 

} 

内容は以下のとおりです。

public class Main 
{ 
    public static int count = 0; 
    public static boolean started = false; 
} 

I以下のロジックを実装したい:

private void btnStartStopMouseClicked(java.awt.event.MouseEvent evt) 
{ 
    if (Main.stared == true) 
    { 
     // logic to start counting 
    } 
    else 
    { 
     // logic to stop counting 
    } 
} 

私の問題はこれです:

  1. 1秒ごとにlblCounterを更新するにはどうすればよいですか?
  2. タイマーを1秒間開始するためにどのようなロジックを実装し、その方法でlblCounterにアクセスするにはどうすればよいですか?

助けてください。作業コードは非常に高く評価されるでしょう。前もって感謝します。ジェイ

+0

が返ってきます。私はそれを提供することができるでしょう。 – Jay

+0

私は作業サンプルコードを追加しました、これはあなたが欲しいものですか? –

答えて

6

は単にあなたのために、このことを行うために、javax.swing.Timer使用して、1 ActionListenerを作ります。ここで

:-)動作するコード例については、私に10分を与えることは、さらに、ヘルプのためのサンプルプログラムです:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class UpdateWithTimer extends JFrame 
{ 
    private Timer timer; 
    private JButton startStopButton; 
    private JLabel changingLabel; 
    private int counter = 0; 
    private boolean flag = false; 
    private ActionListener timerAction = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      counter++; 
      changingLabel.setText("" + counter); 
     } 
    }; 

    private ActionListener buttonAction = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      if (!flag) 
      { 
       startStopButton.setText("STOP TIMER"); 
       timer.start(); 
       flag = true; 
      } 
      else if (flag) 
      { 
       startStopButton.setText("START TIMER"); 
       timer.stop(); 
       flag = false; 
      } 
     } 
    }; 

    private void createAndDisplayGUI() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationByPlatform(true); 

     JPanel contentPane = new JPanel(); 
     changingLabel = new JLabel("" + counter); 
     contentPane.add(changingLabel); 

     startStopButton = new JButton("START TIMER"); 
     startStopButton.addActionListener(buttonAction); 

     add(contentPane, BorderLayout.CENTER); 
     add(startStopButton, BorderLayout.PAGE_END); 

     timer = new Timer(1000, timerAction); 

     setSize(300, 300); 
     setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new UpdateWithTimer().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

あなたはカウンターが再び単に、タイマーを停止するには、0に戻す場合buttonActionactionPerformed(...)方法に

else if (flag) 
{ 
    startStopButton.setText("START TIMER"); 
    timer.stop(); 
    flag = false; 
    counter = 0; 
    changingLabel.setText("" + counter); 
} 

この部分を追加します。

+0

ありがとうGagandeep。私の一日は...あまりにも良かった。今私はこれをベースにして、私のシミュレーション・デザインを進めることができます。再度、感謝します。 – Jay

+0

@Jay:あなたは大歓迎で、笑い続ける:-) –

2

[OK]ですので、私がお勧めするものはSwingWorkerです。 SwingWorkerを拡張することができ、doBackground()でを持つa while(!isCancelled())ループを実行します。スリープ実行後、ラベルの値をインクリメントするプロパティの変更を発生させることができます。

停止ボタンを押すたびに、現在のスイングワーカーをキャンセルするだけです。スタートボタンを押すと、スレーブワーカー

関連する問題