2011-07-25 5 views
2

私はあるクラス(Welcomeという名前)に "status" JLabelを持っていて、もう1つはTimerという名前のタイマーです。今、最初のものは "ステータス"という単語を表示し、2番目のものはカウントダウンを行うべきです。私はそれが欲しいと思う方法ですが、10、9、8、7 ... 0を表示する方法を知りません(そして次のウィンドウに移動します)。私の試みこれまで:JLabelはカウントダウンを表示しています。

// class Welcome 

setLayout(new BorderLayout()); 
JPanel area = new JPanel(); 
JLabel status = new JLabel("status"); 
area.setBackground(Color.darkGray); 
Font font2 = new Font("SansSerif", Font.BOLD, 25); 
status.setFont(font2); 
status.setForeground(Color.green);  
area.add(status, BorderLayout.EAST); // can I put it in the bottom-right corner? 
this.add(area); 

とタイマー:

public class Timer implements Runnable { 

// public void runThread() { 
//  new Thread(this).start(); 
// } 

public void setText(final String text) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      setText(text); // link to status here I guess 
     } 
    }); 
} 

public void run() { 
    for (int i = 10; i > 0; i--) { 
     // set the label 
     final String text = "(" + i + ") seconds left"; 
     setText(text); 

//   // sleep for 1 second 
//   try { 
//    Thread.currentThread(); 
//    Thread.sleep(1000); 
//   } catch (Exception ex) { 
//   } 
    } 
    // go to the next window 
    UsedBefore window2 = new UsedBefore(); 
    window2.setVisible(true); 
} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    // runThread(); 
} 

} // end class 

答えて

4

をBorderLayout.SOUTHか.PAGE ENDまたは.LINE ENDを試してみてください、私はあなたがアンファムあたりとしての「Java」タイマーを使用することを検討すべきであることを同意するが、実際にはいくつかのTimerクラスが用意されていますが、Swing TimerはAnhが提案するjava.util.Timerではなく、あなたの目的に最も適しています。

あなたの問題については、実際には単純な参照の問題以上のものではありません。ラベルを持つクラスにパブリックメソッド、たとえばsetCountDownLabelText(String text)を与え、タイマーを保持するクラスからそのメソッドを呼び出します。他のクラスのタイマーJLabelでGUIクラスの参照を持つ必要があります。例えば

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class Welcome extends JPanel { 
    private static final String INTRO = "intro"; 
    private static final String USED_BEFORE = "used before"; 
    private CardLayout cardLayout = new CardLayout(); 
    private JLabel countDownLabel = new JLabel("", SwingConstants.CENTER); 

    public Welcome() { 
     JPanel introSouthPanel = new JPanel(); 
     introSouthPanel.add(new JLabel("Status:")); 
     introSouthPanel.add(countDownLabel); 

     JPanel introPanel = new JPanel(); 
     introPanel.setPreferredSize(new Dimension(400, 300)); 
     introPanel.setLayout(new BorderLayout()); 
     introPanel.add(new JLabel("WELCOME", SwingConstants.CENTER), BorderLayout.CENTER); 
     introPanel.add(introSouthPanel, BorderLayout.SOUTH); 

     JPanel usedBeforePanel = new JPanel(new BorderLayout()); 
     usedBeforePanel.setBackground(Color.pink); 
     usedBeforePanel.add(new JLabel("Used Before", SwingConstants.CENTER)); 

     setLayout(cardLayout); 
     add(introPanel, INTRO); 
     add(usedBeforePanel, USED_BEFORE); 

     new HurdlerTimer(this).start(); 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("Welcome"); 
     frame.getContentPane().add(new Welcome()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

    public void setCountDownLabelText(String text) { 
     countDownLabel.setText(text); 
    } 

    public void showNextPanel() { 
     cardLayout.next(this); 
    } 
} 

class HurdlerTimer { 
    private static final int TIMER_PERIOD = 1000; 
    protected static final int MAX_COUNT = 10; 
    private Welcome welcome; // holds a reference to the Welcome class 
    private int count; 

    public HurdlerTimer(Welcome welcome) { 
     this.welcome = welcome; // initializes the reference to the Welcome class. 
     String text = "(" + (MAX_COUNT - count) + ") seconds left"; 
     welcome.setCountDownLabelText(text); 
    } 

    public void start() { 
     new Timer(TIMER_PERIOD, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (count < MAX_COUNT) { 
       count++; 
       String text = "(" + (MAX_COUNT - count) + ") seconds left"; 
       welcome.setCountDownLabelText(text); // uses the reference to Welcome 
      } else { 
       ((Timer) e.getSource()).stop(); 
       welcome.showNextPanel(); 
      } 
     } 
     }).start(); 
    } 

} 
+0

申し訳ありませんが、最後の文を取得していません。別の言葉でそれを入れてもらえますか? – Hurdler

+0

@Hurdler:編集 –

+0

をどうぞ宜しくお願い致します。私はコードを通過し、それを完了します!再度、感謝します。ところで、頑強な「ステータス」ラベルに関するヒントはありますか? – Hurdler

0

なぜ歓迎クラスのSetTextメソッドを入れて、ちょうどありません " status.setText(text) '?

そして、あなたは右下隅にタイマーを得るために

+0

私はそれが右にとどまり、降りたくない理由は、レイアウト内の垂直方向の配置の問題だと思います。 – Hurdler

3

あなたはjavax.swing.Timer、ないjava.util.Timerを使用する必要がありますSwingを使っているので。タイマーを1秒(1000ミリ秒)の間隔で発火させるように設定し、リスナーに更新を依頼させることができます。 Swingの更新はイベントディスパッチスレッドで行われなければならないので、リスナーはstatus.setTextにとって最適な場所です。

+0

私はすぐに読むことができるように、このタイマーは毎秒(または私たちがそれを伝えるもの)アクションを実行することができますが、私が望むのは10秒後にアクションを実行するタイマーです。 (10、9、8などを表示するのに適していますが、0の後は何ですか?) – Hurdler

+2

次にタイマーを停止します。 – camickr

+0

@Hurdler、このタイマーを使用してカウントダウンまたは一度発射することができます。カウントダウンして停止するには、タイマーにアタッチされた 'ActionListener'インスタンスで、カウントダウンしてタイマーで' stop'メソッドを停止したいとき。タイマーがリスナーを一度しか呼び出さないようにするには、タイマーを起動する前に 'setRepeats(false)'を呼び出します。 – Paul

関連する問題