java - Jlabel 显示旧数字和新数字

标签 java swing

我的 Jlabel 不仅显示当前 (tNow - tStart) % 10000,还显示所有过去的,我该如何解决这个问题?

导入 javax.swing.; 导入 java.awt.;

公共(public)类主要{

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);

}

}

最佳答案

frame.add(label);

不要不断向框架添加组件。删除该声明。

相反,您需要更新框架上的现有标签:

因此您需要进行一些更改:

  1. 创建 JLabel 并将其添加到 main() 方法中的框架中。

  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();
            }
        });
    }
}

我建议您更新代码以使用类似的内容而不是当前的代码。

关于java - Jlabel 显示旧数字和新数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36291429/

相关文章:

java - 无法使用 GSON lib 反序列化对象

java - 我如何在java中使用setPreferredSize?

java - 如何使用 Java Swing 定时器在每次触发时做不同的事情?

java - Intellij 缺少 Java 语法突出显示

java - 如何在干净模式下运行eclipse?如果我们这样做会发生什么?

java - Firebase:类 java.util.List 具有通用类型参数

java - 我应该添加什么代码才能使之前打印的矩形保持不变,而不是在绘制新矩形时被删除?

java - java游戏开发中的窗口崩溃

java - 我的 Jlists 没有发生滚动

java - 如何使用 VTD-XML 解析器删除特定节点