Set dynamic JLabel text in a JDialog by timer

后端 未结 4 747
终归单人心
终归单人心 2020-12-21 18:10

Im trying to make a JDialog that will show the user a dynamic message on a JLabel. The message should be a count from 1 to 10 (and it should be changing a number every secon

相关标签:
4条回答
  • 2020-12-21 18:44

    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);
    
    0 讨论(0)
  • 2020-12-21 18:57

    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();
                }
            });
        }
    }
    
    0 讨论(0)
  • 2020-12-21 19:02

    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.

    0 讨论(0)
  • 2020-12-21 19:05
    • 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

    0 讨论(0)
提交回复
热议问题