2016-03-29 5 views
0

My Jlabelはpresent(tNow - tStart)%10000だけでなく過去のものも表示しますが、どうすれば修正できますか?Jlabelは古い番号と新しい番号の両方を表示します

import javax.swing。 ; import java.awt。;

パブリッククラスメイン{

public static void main(String[] args) { 
    JFrame frame = new JFrame("FrameDemo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    //frame.setSize(500, 500); 
    frame.setUndecorated(true); 
    frame.getContentPane().setBackground(Color.GREEN); 
    final long tStart = System.currentTimeMillis(); 
    long tNow = 0; 
    System.out.println(tStart); 
    while (1 != 0) { 
     add_time(tNow, frame); 
    } 
} 

public static void add_time(long tStart, JFrame frame) { 
    long tNow = System.currentTimeMillis(); 

    if ((tNow - tStart) % 10000 >= 5000) { 
     frame.setVisible(true); 
     //System.out.println((tNow - tStart) % 10000); 
     JLabel label = new JLabel("Test", JLabel.CENTER); 
     label.setText(String.valueOf((tNow - tStart) % 10000)); 
     label.setFont(new Font("Serif", Font.BOLD, 240)); 
     label.setSize(500, 500); 
     frame.add(label); 
     //label.setText(""); 
    } else frame.setVisible(false); 

} 

}

+0

一度に1つの問題を解決してください。いずれにせよ、あなたはいつもそれを稼働させる方法の例が与えられています。私があなたに与えたコードのif文を取り除くだけです。 – camickr

答えて

3
frame.add(label); 

フレームにコンポーネントを追加し続けるしないでください。その声明を取り除く。

代わりにあなたは、フレーム上の既存のラベルを更新する必要があります。

ですから、変更のカップルを行う必要があります。

  1. は(のJLabelを作成し、メインフレームに追加) 方法。

  2. 次に、addTime(...)メソッドを変更して、ラベルをフレームの外側のメソッドに渡す必要があります。次に、ラベルのsetText()メソッドを使ってラベルを更新することができます。

実際これは設計が間違っているコードです。すべてのコードに静的メソッドを使用するべきではありません。ここでは、より良いあなたのコードとどのようにラベルのテキストを更新するためにTimerを使用する方法を構築する方法を示す例です:

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

public class TimerTime extends JPanel implements ActionListener 
{ 
    private JLabel timeLabel; 
    private int count = 0; 

    public TimerTime() 
    { 
     timeLabel = new JLabel(new Date().toString()); 
     add(timeLabel); 

     Timer timer = new Timer(1000, this); 
     timer.setInitialDelay(1); 
     timer.start(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     //System.out.println(e.getSource()); 
     timeLabel.setText(new Date().toString()); 
//  timeLabel.setText(String.valueOf(System.currentTimeMillis())); 
     count++; 

     if (count == 10) 
     { 
      Timer timer = (Timer)e.getSource(); 
      timer.stop(); 
     } 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("TimerTime"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TimerTime()); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

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

私はあなたの代わりにあなたの現在のコードのようなものを使用するようにコードを更新示唆しています。

1

JLabelを新しく作成し、add_timeが呼び出され、タイミング条件が満たされるたびにフレームに追加します。つまり、JLabelの[削除:新しい時刻の値が追加されたように、お互いの隣に表示されます。例えばJLabel1 + JLabel2 + JLabel3]を古い値の上に置きます。

label変数を一度宣言してから、add_timenew JLabelを使用するのではなく、そのテキスト値を更新する必要があります。

+1

'これはJLabelがお互い隣に現れるようになることを意味します - 実際には互いに隣り合って現れません。ラベルはフレームの 'CENTER'に追加されます。これは、ラベルが互いの上に表示されることを意味し、結局のところ、数字が互いの上にペイントされると、黒いテキストの大きな矩形のブロックを取得します。 – camickr

+0

ああ、ありがとう。 – ReadyPlayer2

関連する問題