在JavaSwing中通过循环更新Jlabel文本?

在JavaSwing中通过循环更新Jlabel文本?,java,swing,Java,Swing,只要循环在运行,我就想每秒更新一次Jlabel文本。我怎么能这样做?我想从现在开始做这件事 JPanel jpnl=new JPanel(); jfrm.add(jpnl); String[] fonts=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); jlab = new JLabel("This is Label"); jpnl.add(jlab)

只要循环在运行,我就想每秒更新一次Jlabel文本。我怎么能这样做?我想从现在开始做这件事

JPanel jpnl=new JPanel();
    jfrm.add(jpnl);
    String[] fonts=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
    jlab = new JLabel("This is Label");
    jpnl.add(jlab);

        for(int i=0;i<fonts.length;i++){
            System.out.println(fonts[i]);
            jlab.setText(fonts[i]);
            jlab.setFont(new Font(fonts[i],Font.PLAIN,30));
            jlab.setForeground(Color.DARK_GRAY);
        }
JPanel-jpnl=new-JPanel();
jfrm.add(jpnl);
String[]fonts=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
jlab=新的JLabel(“这是标签”);
jpnl.add(jlab);

对于(int i=0;iSwing的单线程特性排除了使用循环或
Thread.sleep
,就像您尝试的那样。这样做只会阻塞UI并阻止它被绘制/更新,直到循环完成

因为Swing不是线程安全的,所以您不能简单地使用另一个
线程
和上述方法来更新UI,而不需要跳过一些障碍

您的问题的答案是使用Swing
计时器
,它定期触发更新。因为这些更新是在事件调度线程的上下文中触发的,所以在您想要更新UI时使用它是安全的

请仔细查看以了解更多详细信息

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private String[] fonts;
        private final JLabel jlab;
        private int index = 0;

        public TestPane() {
            setLayout(new GridBagLayout());
            fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
            jlab = new JLabel("This is Label");
            add(jlab);

            Timer timer = new Timer(1000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    updateFont();
                    index++;
                    if (index >= fonts.length) {
                        ((Timer)e.getSource()).stop();
                    }
                }
            });
            timer.setInitialDelay(0);
            timer.start();
        }

        protected void updateFont() {
            System.out.println(fonts[index]);
            jlab.setText(fonts[index]);
            jlab.setFont(new Font(fonts[index], Font.PLAIN, 30));
            jlab.setForeground(Color.DARK_GRAY);           
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}

如果只是时间是一个问题,并且您没有指定其他要求,那么您可以在循环中使用Thread.sleep(1000)您可以解释更简单的Thread.sleep(1000)吗在循环内将不起作用。首先,不要使用
线程。sleep
,它只会使循环运行的时间更长,并阻止用户界面的更新。圆锥形的答案是使用Swing
定时器
@MadProgrammer plz在这里解释我是如何使用定时器的,因为我在Thread.sleep()中面临同样的问题@RavibhushanKumar我有点想知道,如果你在回复之前尝试谷歌“java swing timer”,它会引导你获得大量信息,还有无数的例子