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

Rav*_*mar 1 java swing

只要循环运行,我想在每秒更新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);
        }
Run Code Online (Sandbox Code Playgroud)

Mad*_*mer 6

Swing的单线程性质排除了使用循环或Thread.sleep您似乎尝试的方式.这样做只会阻止UI并阻止它被绘制/更新,直到循环完成.

因为Swing不是线程安全的,所以你不能简单地使用另一个Thread和上面的方法来更新UI,而不会跳过一些箍

你的问题的圆锥形答案是使用Swing Timer,它会定期触发更新.因为这些更新是在事件调度线程的上下文中触发的,所以当您想要更新UI时,可以安全地使用它们.

仔细查看如何使用Swing Timers获取更多详细信息

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

    }

}
Run Code Online (Sandbox Code Playgroud)