微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 JFrame 上的迭代之间使 for 循环延迟 1 秒?

如何解决如何在 JFrame 上的迭代之间使 for 循环延迟 1 秒?

这是我目前的功能

    public void slow_print(final String s,int interval){
        for (int i=0; i<s.length(); i++){
            txta_main.setText(
                txta_main.getText()
                + String.valueOf(s.charat(i))
            );
        }
    }

我不知道如何让它在 setText调用之间等待。我无法使用 Thread.sleep,因为这是在 GUI 上,并且 sleep 会冻结输出,直到整个字符串完成。

解决方法

使用 Swing Timer 进行基本动画。

定时器取代了你的循环逻辑。

每次计时器触发您的“索引”变量并执行您的处理。

这是一个简单的例子,它只是增加索引变量并在处理完成 10 个周期时停止。

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

public class TimerStop extends JPanel implements ActionListener
{
    private JLabel timeLabel;
    private int count = 0;

    public TimerStop()
    {
        timeLabel = new JLabel( new Date().toString() );
        add( timeLabel );

        Timer timer = new Timer(1000,this);
        timer.setInitialDelay(1);
        timer.start();
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        timeLabel.setText( new Date().toString() );
        count++;
        System.out.println(count);

        if (count == 10)
        {
            Timer timer = (Timer)e.getSource();
            timer.stop();
        }
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("TimerStop");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TimerStop() );
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

因此,您只需修改计时器逻辑,在每次计时器触发时向文本字符串附加一个字符,然后停止计时器,然后显示所有文本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。