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