通过计时器在JDialog中设置动态JLabel文本

时间:2012-03-28 12:34:43

标签: java multithreading swing jlabel jdialog

我试图创建一个JDialog,它将在JLabel上向用户显示动态消息。 消息应该是从1到10的计数(并且应该每秒更改一个数字)。 事情是,当我调试它时 - 它就在“dia.setVisible(true);”之后停止。 ,除非我关闭JDialog,否则不会继续。 是否有任何可能的方法来修复它? 感谢。

看看代码:

    @Override
public void run() {

    dia = new JDialog(parentDialog, true);
    dia.setLocationRelativeTo(parentFrame);


    String text = "Text ";
    dia.setSize(300, 150);
    jl = new JLabel(text);
    dia.getContentPane().add(jl);
    dia.setVisible(true);
    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();
        }
    }

}

4 个答案:

答案 0 :(得分:3)

  • 不要将Thread.sleep(int)用于Swing GUI,导致冻结直到Thread.sleep(int)结束

  • 使用Swing Timer代替使用Thread.sleep(int)

  • 锁定Swing GUI
  • 请勿使用dia.setSize(300, 150),了解LayoutManager的工作原理

答案 1 :(得分:2)

setVisible是对JDialog的阻止调用。您应该启动另一个Thread并将Runnable传递给它。 Runnable.run()方法应该包含你的循环。

答案 2 :(得分:2)

看看这个代码示例,这是在javax.swing.Timer Tutorials的帮助下使用动态文本的正确方法,而不是使用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();
            }
        });
    }
}

答案 3 :(得分:0)

确保jl定义为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);