Set dynamic JLabel text in a JDialog by timer

为君一笑 提交于 2019-12-02 03:27:42
  • don't use Thread.sleep(int) for Swing GUI, caused freeze of untill Thread.sleep(int) ended

  • use Swing Timer instead of locking Swing GUI by usage of Thread.sleep(int)

  • don't use dia.setSize(300, 150), learn how LayoutManager works

setVisible is a blocking call on JDialog's. You should start an other Thread and pass a Runnable to it. The Runnable.run() method should contain your loop.

Have a look at this code example, that's the proper way to use dynamic text with the help of javax.swing.Timer Tutorials, instead of using Thread.sleep(...) thingy,

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

public class DialogExample extends JDialog
{
    private Timer timer;
    private JLabel changingLabel;
    private int count = 0;
    private String initialText = "TEXT";

    private ActionListener timerAction = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            count++;
            if (count == 10)
                timer.stop();
            changingLabel.setText(initialText + count); 
        }
    };

    private void createDialog()
    {
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setLocationByPlatform(true);

        JPanel contentPane = new JPanel();
        changingLabel = new JLabel(initialText);
        contentPane.add(changingLabel);

        add(contentPane);

        pack();
        setVisible(true);
        timer = new Timer(1000, timerAction);
        timer.start();
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new DialogExample().createDialog();
            }
        });
    }
}

make sure jl is defined as final:

...
dia.getContentPane().add(jl);

new Thread(new Runnable() {
    for (int i = 0; i < 10; i++) {
        try {
            Thread.sleep(1000);
            jl.setText(text + " " + i);

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}).run();

dia.setVisible(true);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!