Установить динамический текст JLabel в JDialog по таймеру - PullRequest
1 голос
/ 28 марта 2012

Я пытаюсь создать 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 ]

3 голосов
/ 28 марта 2012
  • не использовать Thread.sleep(int) для Swing GUI, вызвано зависание до Thread.sleep(int) окончено

  • использовать Swing Timer вместо блокировки Swing GUI с помощьюиспользование Thread.sleep(int)

  • не используйте dia.setSize(300, 150), узнайте, как работает LayoutManager

2 голосов
/ 28 марта 2012

Посмотрите на этот пример кода, это правильный способ использовать динамический текст с помощью 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();
            }
        });
    }
}
2 голосов
/ 28 марта 2012

setVisible - это блокирующий вызов на JDialog. Вы должны запустить другой поток и передать ему Runnable. Метод Runnable.run() должен содержать ваш цикл.

0 голосов
/ 28 марта 2012

убедитесь, что 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);
...