Jlabel显示新旧数字

时间:2016-03-29 17:44:27

标签: java swing

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

}

}

2 个答案:

答案 0 :(得分:3)

frame.add(label);

不要继续向框架添加组件。摆脱那种说法。

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

所以你需要做一些改变:

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

  2. 然后需要更改addTime(...)方法以将标签传递给帧的方法intead。然后你可以使用标签的setText()方法来更新标签。

  3. 实际上这是设计不佳的代码。您不应该为所有代码使用静态方法。以下是一个示例,说明如何更好地构建代码以及如何使用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