每隔X秒从ArrayList <List> – Java更新JLabel

我有一个简单的Java程序,读取文本文件,“”(空格),显示第一个单词,等待2秒,显示下一个…等等…我想在spring这样做,或一些其他的GUI。

关于如何轻松更新spring的话的任何build议? 遍历我的列表,并以某种方式使用setText();

我没有任何运气。 我使用这种方法在CONSOL中打印出我的单词,并添加了JFrame …在CONSOL中很好的工作,但是提供了无穷无尽的jframe。 我在网上发现了大部分。

private void printWords() { for (int i = 0; i < words.size(); i++) { //How many words? //System.out.print(words.size()); //print each word on a new line... Word w = words.get(i); System.out.println(w.name); //pause between each word. try{ Thread.sleep(500); } catch(InterruptedException e){ e.printStackTrace(); } JFrame frame = new JFrame("Run Text File"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel textLabel = new JLabel(w.name,SwingConstants.CENTER); textLabel.setPreferredSize(new Dimension(300, 100)); frame.getContentPane().add(textLabel, BorderLayout.CENTER); //Display the window. frame.setLocationRelativeTo(null); frame.pack(); frame.setVisible(true); } } 

我有一个窗口,使用JFrame和JLable创build,但是,我希望静态文本是dynamic的,而不是加载一个新的弹簧窗口。 我希望它闪烁一个字,消失,闪烁一个字消失。

有关如何更新JLabel的build议? 重绘()的东西? 我正在画空白。

谢谢!

更新:在下面的亲切的帮助下,我已经得到它正确地打印到控制台。 这是我的打印方法:

 private void printWords() { final Timer timer = new Timer(500, null); ActionListener listener = new ActionListener() { private Iterator<Word> w = words.iterator(); @Override public void actionPerformed(ActionEvent e) { if (w.hasNext()) { _textField.setText(w.next().getName()); //Prints to Console just Fine... //System.out.println(w.next().getName()); } else { timer.stop(); } } }; timer.addActionListener(listener); timer.start(); } 

但是,这不是更新标签? 我的构造函数看起来像:

 public TimeThis() { _textField = new JTextField(5); _textField.setEditable(false); _textField.setFont(new Font("sansserif", Font.PLAIN, 30)); JPanel content = new JPanel(); content.setLayout(new FlowLayout()); content.add(_textField); this.setContentPane(content); this.setTitle("Swing Timer"); this.pack(); this.setLocationRelativeTo(null); this.setResizable(false); //_textField.setText("loading..."); } 

到达那里……一旦我或者任何人协助我,我都会发布修补程序。 再次感谢!

首先,构build并显示您的GUI。 一旦显示GUI,使用javax.swing.Timer每500毫秒更新GUI:

 final Timer timer = new Timer(500, null); ActionListener listener = new ActionListsner() { private Iterator<Word> it = words.iterator(); @Override public void actionPerformed(ActionEvent e) { if (it.hasNext()) { label.setText(it.next().getName()); } else { timer.stop(); } } }; timer.addActionListener(listener); timer.start(); 

切勿在Swing代码中使用Thread.sleep(int) ,因为它会阻塞EDT; 在这里 ,

使用Thread.sleep(int)的结果是这样的:

在这里输入图像描述

Thread.sleep(int)结束时

在这里输入图像描述

示例代码:

 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import java.util.LinkedList; import java.util.Queue; import java.util.Random; import javax.swing.*; //http://stackoverflow.com/questions/7943584/update-jlabel-every-x-seconds-from-arraylistlist-java public class ButtonsIcon extends JFrame implements Runnable { private static final long serialVersionUID = 1L; private Queue<Icon> iconQueue = new LinkedList<Icon>(); private JLabel label = new JLabel(); private Random random = new Random(); private JPanel buttonPanel = new JPanel(); private JPanel labelPanel = new JPanel(); private Timer backTtimer; private Timer labelTimer; private JLabel one = new JLabel("one"); private JLabel two = new JLabel("two"); private JLabel three = new JLabel("three"); private final String[] petStrings = {"Bird", "Cat", "Dog", "Rabbit", "Pig", "Fish", "Horse", "Cow", "Bee", "Skunk"}; private boolean runProcess = true; private int index = 1; private int index1 = 1; public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ButtonsIcon t = new ButtonsIcon(); } }); } public ButtonsIcon() { iconQueue.add(UIManager.getIcon("OptionPane.errorIcon")); iconQueue.add(UIManager.getIcon("OptionPane.informationIcon")); iconQueue.add(UIManager.getIcon("OptionPane.warningIcon")); iconQueue.add(UIManager.getIcon("OptionPane.questionIcon")); one.setFont(new Font("Dialog", Font.BOLD, 24)); one.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); two.setFont(new Font("Dialog", Font.BOLD, 24)); two.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); three.setFont(new Font("Dialog", Font.BOLD, 10)); three.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); labelPanel.setLayout(new GridLayout(0, 3, 4, 4)); labelPanel.add(one); labelPanel.add(two); labelPanel.add(three); //labelPanel.setBorder(new LineBorder(Color.black, 1)); labelPanel.setOpaque(false); JButton button0 = createButton(); JButton button1 = createButton(); JButton button2 = createButton(); JButton button3 = createButton(); buttonPanel.setLayout(new GridLayout(0, 4, 4, 4)); buttonPanel.add(button0); buttonPanel.add(button1); buttonPanel.add(button2); buttonPanel.add(button3); //buttonPanel.setBorder(new LineBorder(Color.black, 1)); buttonPanel.setOpaque(false); label.setLayout(new BorderLayout()); label.add(labelPanel, BorderLayout.NORTH); label.add(buttonPanel, BorderLayout.SOUTH); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); label.setPreferredSize(new Dimension(d.width / 3, d.height / 3)); add(label, BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); startBackground(); startLabel2(); new Thread(this).start(); printWords(); // generating freeze Swing GUI durring EDT } private JButton createButton() { JButton button = new JButton(); button.setBorderPainted(false); button.setBorder(null); button.setFocusable(false); button.setMargin(new Insets(0, 0, 0, 0)); button.setContentAreaFilled(false); button.setIcon(nextIcon()); button.setRolloverIcon(nextIcon()); button.setPressedIcon(nextIcon()); button.setDisabledIcon(nextIcon()); nextIcon(); return button; } private Icon nextIcon() { Icon icon = iconQueue.peek(); iconQueue.add(iconQueue.remove()); return icon; } // Update background at 4/3 Hz private void startBackground() { backTtimer = new javax.swing.Timer(750, updateBackground()); backTtimer.start(); backTtimer.setRepeats(true); } private Action updateBackground() { return new AbstractAction("Background action") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { label.setIcon(new ImageIcon(getImage())); } }; } // Update Label two at 2 Hz private void startLabel2() { labelTimer = new javax.swing.Timer(500, updateLabel2()); labelTimer.start(); labelTimer.setRepeats(true); } private Action updateLabel2() { return new AbstractAction("Label action") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { two.setText(petStrings[index]); index = (index + 1) % petStrings.length; } }; } // Update lable one at 3 Hz @Override public void run() { while (runProcess) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { one.setText(petStrings[index1]); index1 = (index1 + 1) % petStrings.length; } }); try { Thread.sleep(300); } catch (Exception e) { e.printStackTrace(); } } } // Note: blocks EDT private void printWords() { for (int i = 0; i < petStrings.length; i++) { String word = petStrings[i].toString(); System.out.println(word); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } three.setText(word); } three.setText("<html> Concurency Issues in Swing<br>" + " never to use Thread.sleep(int) <br>" + " durring EDT, simple to freeze GUI </html>"); } public BufferedImage getImage() { int w = label.getWidth(); int h = label.getHeight(); GradientPaint gp = new GradientPaint(0f, 0f, new Color( 127 + random.nextInt(128), 127 + random.nextInt(128), 127 + random.nextInt(128)), w, w, new Color(random.nextInt(128), random.nextInt(128), random.nextInt(128))); BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = bi.createGraphics(); g2d.setPaint(gp); g2d.fillRect(0, 0, w, h); g2d.setColor(Color.BLACK); return bi; } } 
  import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import javax.swing.*; class TimeThis extends JFrame { private static final long serialVersionUID = 1L; private ArrayList<Word> words; private JTextField _textField; // set by timer listener public TimeThis() throws IOException { _textField = new JTextField(5); _textField.setEditable(false); _textField.setFont(new Font("sansserif", Font.PLAIN, 30)); JPanel content = new JPanel(); content.setLayout(new FlowLayout()); content.add(_textField); this.setContentPane(content); this.setTitle("Swing Timer"); this.pack(); this.setLocationRelativeTo(null); this.setResizable(false); _textField.setText("loading..."); readFile(); // read file printWords(); // print results } public void readFile(){ try { BufferedReader in = new BufferedReader(new FileReader("adameve.txt")); words = new ArrayList<Word>(); int lineNum = 1; // we read first line in start // delimeters of line in this example only "space" char [] parse = {' '}; String delims = new String(parse); String line = in.readLine(); String [] lineWords = line.split(delims); // split the words and create word object //System.out.println(lineWords.length); for (int i = 0; i < lineWords.length; i++) { Word w = new Word(lineWords[i]); words.add(w); } lineNum++; // pass the next line line = in.readLine(); in.close(); } catch (IOException e) { } } private void printWords() { final Timer timer = new Timer(100, null); ActionListener listener = new ActionListener() { private Iterator<Word> w = words.iterator(); @Override public void actionPerformed(ActionEvent e) { if (w.hasNext()) { _textField.setText(w.next().getName()); //Prints to Console just Fine... //System.out.println(w.next().getName()); } else { timer.stop(); } } }; timer.addActionListener(listener); timer.start(); } class Word{ private String name; public Word(String name) { this.name = name; } public String getName() { return name; } } public static void main(String[] args) throws IOException { JFrame ani = new TimeThis(); ani.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ani.setVisible(true); } } 

我使用这个代码…希望它可以帮助别人扩展他们的Java知识。 此外,如果有人有任何清理这个build议。 请这样做!

你在正确的轨道上,但是你正在创造框架的循环内,而不是在外面。 这是它应该是什么样的:

 private void printWords() { JFrame frame = new JFrame("Run Text File"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel textLabel = new JLabel("", SwingConstants.CENTER); textLabel.setPreferredSize(new Dimension(300, 100)); frame.getContentPane().add(textLabel, BorderLayout.CENTER); //Display the window. frame.setLocationRelativeTo(null); frame.pack(); frame.setVisible(true); for (int i = 0; i < words.size(); i++) { //How many words? //System.out.print(words.size()); //print each word on a new line... Word w = words.get(i); System.out.println(w.name); //pause between each word. try{ Thread.sleep(500); } catch(InterruptedException e){ e.printStackTrace(); } textLabel.setTest(w.name); } }