我的Jlabel不仅显示存在(tNow - tStart)%10000,而且显示所有过去的,我该如何解决?
import javax.swing。; import java.awt。;
public class Main {
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 :(得分:3)
frame.add(label);
不要继续向框架添加组件。摆脱那种说法。
相反,您需要更新框架上的现有标签:
所以你需要做一些改变:
创建JLabel并将其添加到main()方法中的框架中。
然后需要更改addTime(...)
方法以将标签传递给帧的方法intead。然后你可以使用标签的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 :(得分:1)
您正在创建一个新的JLabel
并在每次调用add_time
时将其添加到帧中并且满足时间条件。这意味着您最终会出现JLabel
出现的[已删除:彼此相邻,就好像附加了新的时间值一样。例如JLabel1 + JLabel2 + JLabel3]在旧值之上。
您应该声明label
变量一次,然后更新其文本值,而不是使用new JLabel
中的add_time
。